본문 바로가기
codingtest

[programmers] 옹알이 (1), 짝수는 싫어요, 배열 두배 만들기, 중앙값 구하기, 최빈값 구하기

by 안자두 2023. 3. 22.

📝 [Lv0] 옹알이 (1)

👀 문제 설명

머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

 

🚨 제한 사항

  • 1 ≤ babbling의 길이 ≤ 100
  • 1 ≤ babbling[i]의 길이 ≤ 15
  • babbling의 각 문자열에서 "aya", "ye", "woo", "ma"는 각각 최대 한 번씩만 등장합니다.
    • 즉, 각 문자열의 가능한 모든 부분 문자열 중에서 "aya", "ye", "woo", "ma"가 한 번씩만 등장합니다.
  • 문자열은 알파벳 소문자로만 이루어져 있습니다.

 

💻 입출력 예

babbling result
["aya", "yee", "u", "maa", "wyeoo"] 1
["ayaye", "uuuma", "ye", "yemawoo", "ayaa"] 3

 

✨ 풀이 설명

단어마다 while문을 이용해 자른 단어가 말할 수 있는 네 가지 중 포함되어 있는지를 확인해 주었다.
만약 포함되어 있다면 그 부분을 잘라 뒷부분만 재할당하였고, 아니라면 말할 수 없는 단어이기 때문에 false를 반환했다.

정규식으로 풀 수 있을 것 같아 다른 풀이를 확인해 보았다.
문자 중, 처음부터 끝까지 "aya", "ye", "woo", "ma"만 포함하며, 한 개 이상 존재하는지를 확인하는 정규식을 만들면 되었다. 아래 코드는 정규식을 사용한 코드이다.
확실히 문자열 비교는 정규식을 사용하면 훨씬 간단하게 해결할 수 있는 것 같다.

 

🕵️‍♂️ 코드

function solution(babbling) {
  return babbling.filter(b => {
    while (b.length) {
      if (['aya', 'woo'].includes(b.slice(0, 3))) b = b.slice(3);
      else if (['ye', 'ma'].includes(b.slice(0, 2))) b = b.slice(2);
      else return false;
    }
    return true;
  }).length;
}
function solution(babbling) {
  const reg = /^(aya|ye|woo|ma)+$/
  return babbling.filter(word => reg.test(word)).length;
}
 
 

📝 [Lv0] 짝수는 싫어요

👀 문제 설명

정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return하도록 solution 함수를 완성해주세요.

 

🚨 제한 사항

  • 1 ≤ n ≤ 100

 

💻 입출력 예

n result
10 [1, 3, 5, 7, 9]
15 [1, 3, 5, 7, 9, 11, 13, 15]

 

✨ 풀이 설명

우선 n까지 나올 수 있는 홀수의 개수를 크기로 갖는 일차원 배열을 만들어주었다. 짝수는 2로 나눈 만큼의 홀수개가 나오지만, 홀수의 경우에는 홀수의 개수가 1개 더 많기 때문에 올림을 통해 해결해 주었다.
그런 다음, map()의 인덱스를 이용해 각 인덱스 * 2에 1을 더한 수를 반환해 주었다.

만약 n이 15라면, 배열은 8 크기이고 각 배열의 인덱스는 0부터 7까지가 된다. 따라서 반환되는 수는 1부터 15까지의 홀수만 나오게 된다.

 

🕵️‍♂️ 코드

function solution(n) {
  return new Array(Math.ceil(n / 2)).fill().map((_, i) => i * 2 + 1);
}

 


📝 [Lv0] 배열 두배 만들기

👀 문제 설명

정수 배열 numbers가 매개변수로 주어집니다. numbers의 각 원소에 두배한 원소를 가진 배열을 return하도록 solution 함수를 완성해주세요.

 

🚨 제한 사항

  • -10,000 ≤ numbers의 원소 ≤ 10,000
  • 1 ≤ numbers의 길이 ≤ 1,000

 

💻 입출력 예

numbers result
[1, 2, 3, 4, 5] [2, 4, 6, 8, 10]
[1, 2, 100, -99, 1, 2, 3] [2, 4, 200, -198, 2, 4, 6]

 

✨ 풀이 설명

map() 함수를 사용하는 기본 예제라고 생각한다. 각 숫자에 2를 곱한 값이 있는 새로운 배열을 반환해 준다.

 

🕵️‍♂️ 코드

function solution(numbers) {
  return numbers.map(number => number * 2);
}

 


📝 [Lv0] 중앙값 구하기

👀 문제 설명

중앙값은 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미합니다. 예를 들어 1, 2, 7, 10, 11의 중앙값은 7입니다. 정수 배열 array가 매개변수로 주어질 때, 중앙값을 return 하도록 solution 함수를 완성해보세요.

 

🚨 제한 사항

  • array의 길이는 홀수입니다.
  • 0 < array의 길이 < 100
  • -1,000 < array의 원소 < 1,000

 

💻 입출력 예

array result
[1, 2, 7, 10, 11] 7
[9, -1, 0] 0

 

✨ 풀이 설명

중앙값을 구하려면 우선 배열을 정렬해야 한다. 가운데에 위치한 값을 구하는 것이므로 오름차순이든 내림차순이든 상관없다. 정렬된 배열 중, 가운데 숫자를 반환하면 되는데, array의 길이가 홀수이기 때문에 1을 빼준 후, 2로 나눠주면 중앙값을 구할 수 있다.

 

🕵️‍♂️ 코드

function solution(array) {
  return array.sort((a, b) => a - b)[(array.length1) / 2];
}

 


📝 [Lv0] 최빈값 구하기

👀 문제 설명

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.

 

🚨 제한 사항

  • 0 < array의 길이 < 100
  • 0 ≤ array의 원소 < 1000

 

💻 입출력 예

array result
[1, 2, 3, 3, 3, 4] 3
[1, 1, 2, 2] -1
[1] 1

 

✨ 풀이 설명

문제를 보자마자 'Map을 사용해야겠다'라고 생각했다. Map 객체는 key-value 쌍인 집합이고, key는 한 Map에서 오로지 한 개만 존재할 수 있다. 객체와 다른 점 중 하나는 iterable 하기 때문에 직접 반복할 수 있다는 점이다. 또한 key-value 쌍의 빈번한 추가 및 제거와 관련된 상황에서 객체에 비해 성능이 더 좋다.

각 숫자가 나오는 빈도를 세기 위해, array의 각 숫자를 새로운 map함수인 hash에 추가해 주었는데, 만약 기존에 이 숫자를 key로 갖는 hash가 존재한다면 get() 메서드로 해당 숫자의 value를 불러오고 아닐 경우 0에 1을 더해주었다.

Map은 key, value를 원소로 갖는 이차원 배열로 변환할 수 있다. 이렇게 변환한 배열을 두 번째 인덱스의 값, 즉 value인 빈도수를 기준으로 내림차순 정렬을 해주었다.
정렬된 cntList가 1보다 크면서 첫 번째와 두 번째의 빈도수가 같다면, 최빈값이 여러 개라는 뜻으로 -1을 반환해 주었고,
cntList가 1개이거나 첫 번째의 빈도수가 가장 크다면 해당 수를 반환해 주었다.

 

🕵️‍♂️ 코드

function solution(array) {
  const hash = new Map();
  array.forEach(num => hash.set(num, (hash.get(num) || 0) + 1));

  const cntList = [...hash].sort((prev, next) => next[1] - prev[1]);
  return cntList.length > 1 && cntList[0][1] === cntList[1][1] ? -1 : cntList[0][0];
}

 

728x90