최빈값 구하기

문제

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


제한사항

  • 0 < array의 길이 < 100

  • 0 ≤ array의 원소 < 1000


입출력 예

arrayresult

[1, 2, 3, 3, 3, 4]

3

[1, 1, 2, 2]

-1

[1]

1

입출력 예 설명

입출력 #1

  • [1, 2, 3, 3, 3, 4]에서 1은 1개 2는 1개 3은 3개 4는 1개로 최빈값은 3입니다.

입출력 #2

  • [1, 1, 2, 2]에서 1은 2개 2는 2개로 최빈값이 1, 2입니다. 최빈값이 여러 개이므로 -1을 return 합니다.

입출력 #3

  • [1]에는 1만 있으므로 최빈값은 1입니다.

코드

function solution(array) {
  // array 길이가 1인 경우
  if (array.length === 1) return array[0];

  const obj = {};
  const answer = [];

  array.forEach((n) => {
    obj[n] = ++obj[n] || 1;
  });

  for (let key in obj) {
    answer.push([key, obj[key]]);
  }

  answer.sort((a, b) => b[1] - a[1]); // 갯수 기준으로 내림차순 정렬
  
  // answer 길이가 1인 경우
  if (answer.length === 1) return Number(answer[0][0]);

  // 최빈값이 여러개인 경우 -1 반환
  if (answer[0][1] === answer[1][1]) return -1;

  // 여러개가 아니라면 정렬에서 첫번째 값을 반환한다.
  return Number(answer[0][0]);
}

코드 풀이

array.forEach((n) => {
    obj[n] = ++obj[n] || 1;
});

|| 연산자에서 왼쪽 피연산자가 falsy 값이면 오른쪽 피연산자를 반환하는 것을 이용해서 다음과 같이 작성할 수 있다.

  1. 객체 obj에서 키 n의 값을 가져온다.

  2. 해당 값이 존재하는 경우, 값을 1 증가(++)시킨다.

  3. 해당 값이 존재하지 않는 경우, 1을 할당한다.

for (let key in obj) {
    answer.push([key, obj[key]]);
}

for...in 구문은 객체의 프로퍼티 이름(key)을 순서대로 변수에 할당한다.

따라서 key 변수에는 obj 객체의 각 프로퍼티 이름이 담기게 된다.

// ex
obj = {"1": 2, "2": 2}
for(let key in obj) {
    // 여기에서 key 
    // "1", "2" 문자열을 순서대로 할당받아 반복 수행한다.
}

for...in vs. for...of 차이점

  • for...in 구문은 객체의 프로퍼티를 반복하는 것

  • for...of 구문은 배열을 반복하는 것

🔍 테스트 케이스

처음 작성한 코드에서는 Run time error가 나서 참고할만한 테스트 케이스를 같이 작성했다.

[1, 1, 1] >> 1

Last updated