코딩테스트

[코딩테스트] 최빈값 구하기

이경욱 2023. 11. 3. 20:56

문제

최빈값은 주어진 값 중에서

가장 자주 나오는 값을 의미합니다.

 

정부 배열 array가 매개변수로 주어질 때,

최빈값을 return하도록 solution 함수를 완성해보세요.

 

최빈값이 여러 개면 -1을 return 합니다.

 

 

 


풀이

const array = [1];

  // 1. 위 배열에서 중복 값을 세어본다.
  // 2. 중복 값과 배열 안의 숫자를 한 객체로 묶는다.
  // 3. 객체들을 리스트로 변환한다.
  // 4. 리스트 중 카운트가 큰 순으로 나열한다.
  // 5. 인덱스 0, 1번의 카운트를 비교하여
  // 같지 않으면 index 0 리턴, 같으면 -1을 리턴한다.

function sol (array) {
  const data = [];
  // 중복값이 들어갈 빈 배열을 만들어주고,
  for (let i = 0; i < array.length; i++) {
    const existingEl = data.find((x) => x[0] === array[i])
    // 'data 배열에서 한 번씩 돌며 x의 0번째 인덱스와 array의 i번째 인덱스와
    // 일치하는지 확인해줘. (ex. x[0]은 [3, 1] 이 값에서 3을 뜻한다.)' 
      if (existingEl) {
        // '만약 existingEl 값이 있으면 (ex. [3, 1] 3의 숫자가 1번 반복됐다.)
        // existingEl의 1번째 인덱스에 +1을 해줘.'
        existingEl[1] = existingEl[1] + 1;
      }  else {
        // '만약 없으면 array[i]번째의 값과 1을 넣어줘.'
          data.push([array[i], 1])
      }  
    }
    data.sort((a, b) => b[1] - a[1]);
    console.log(data.length);
    if (data.length === 1) {
      return data[0][0]
    } else if (data[0][1] === data[1][1]) {
      return -1;
    } else {
      return data[0][0]
    }
}

console.log(sol(array));

 

처음에 이중 for문으로 문제를 풀려고 하다가

너무 복잡하게 풀고 있는 것 같아

튜터님께 질의를 드렸더니 이런 해설을 주셨다.

 

먼저 빈 배열을 하나 만들어 준 뒤,

for문 안에서 새로 만든 배열에서 find 메서드를 사용하여

for문 array[i] 와 일치하는지 체크한다.

 

그리고 아래에 if 조건문을 활용해

만약 undefined가 나오면 해당 배열에 array[i]와 숫자 1을 push 한다. (초기값)

 

이후 위에서 find 메서드가 같은 숫자가 나오면

existingEl 변수에 값을 할당해주고,

이 값을 아래 조건문에서 count 시켜주는 코드이다.

 

마지막으로 sort 메서드로

내림차순 정렬 해주면 최빈값이 인덱스 0에 오게된다.

 

조건문을 활용해

중복 최빈값이 있으면 -1, 들어온 데이터가 1개면 비교하지 않게

필터링을 해준 후 리턴하도록 작성했다.

 

 

 


여러 해설 모음

function solution(array) {
    let m = new Map();
    for (let n of array) m.set(n, (m.get(n) || 0)+1);
    m = [...m].sort((a,b)=>b[1]-a[1]);
    return m.length === 1 || m[0][1] > m[1][1] ? m[0][0] : -1;
}

 

 

 

 

const solution = (array) => {
    const counter = array.reduce((acc, cur) => ({
        ...acc,
        [cur]: (acc[cur] || 0) + 1
    }), {})

    const items = Object.keys(counter).map((key) => [
        Number(key), counter[key]
    ]).sort((a, b) => b[1] - a[1])

    if (items[0][1] === items?.[1]?.[1]) {
        return -1
    }

    return items[0][0];
}