코딩테스트

[프로그래머스] 최빈값 구하기

john-lennon 2026. 4. 3. 17:12

문제 설명

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 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

 


 

목적

최빈값 return 하기 / 최빈값이 여러개면 -1 return

 

나의 코드

function solution(array) {
    // count 객체 만들어서 변수에 저장
     const count = array.reduce((acc, cur) => {
         
         acc[cur] = acc[cur] ? acc[cur] + 1 : 1;
             
             return acc;
     }, {}) 
    
    // values 값 꺼내기
    const values = Object.values(count);
    // max 찾기
    const max = Math.max(...values);
    // max 개수 체크
    const check = values.filter(v => v === max)
    
    if (check.length > 1) {
        return -1;
    } else {
        return Number(Object.keys(count).find(key => count[key] === max))
    }
}

 

방식

개수를 세는 거니까 reduce

  1. 각 숫자가 몇 번 나왔는지 센다
  2. 나온 횟수들만 꺼낸다
  3. 그중 가장 큰 횟수를 찾는다
  4. 그 최대 횟수가 몇 개 있는지 본다
  5. 여러 개면 -1, 하나면 그 숫자를 반환한다

 

다른 사람의 코드 ㅡ 자료구조(map)와 정렬로 압축한 풀이

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;
}

 

 

내 코드와 차이점

  • Map
  • for...of
  • 배열로 펼치기 [...]
  • 정렬 sort

을 사용함. 

나는 최대값이 몇 개인지 직접 검사하는 방식

저 코드는 정렬해서 1등과 2등을 비교하는 방식

 

for (let n of array)

배열을 하나씩 돈다

array = [1, 2, 3, 3, 3, 4] 라면

n은 차례대로 1, 2, 3, 3, 3, 4를 돈다

 

[...m]

Map을 배열로 펼침

[[1, 2], [2, 1], [3, 4]] → [숫자, 등장횟수]

 

m.set(n, (m.get(n) || 0) + 1);

→ n이라는 숫자의 등장 횟수를 1 증가시켜서 저장해라

 

sort((a, b)=>b[1]-a[1])

⇒ 등장횟수 기준 내림차순 정렬

a는 예를 들어 [1, 2]

b는 예를 들어 [3, 4]

그러면 a[1] = 2 / b[1] = 4

즉 [1]은 등장횟수 자리

 


 

느낀점

단순히 값을 구하는 것뿐만이 아니라 데이터를 어떻게 구조화해서 다루느냐가 중요하다는 것을 느꼈다. 나는 reduce를 활용해서 각 숫자의 개수를 직접 세고, 최대값을 찾은 뒤 다시 조건을 검사하는 방식으로 풀었는데, 흐름을 하나씩 따라가면서 이해하기에는 좋았지만 코드가 다소 길어지는단점이 있었다...

반면 다른 사람의 코드는 Map과 정렬을 활용해서 등장 횟수를 관리하고, 정렬 후 상위 두개만 비교하는 방식으로 훨씬 간결하게 해결한 점이 인상깊었다...

특히 map을 사용하면 키-값 구조로 데이터를 명확히 관리할 수 있고, 배열로 변환 후 정렬까지 자연스럽게 이어지는 흐름을 만들 수 있다는 점을 새롭게 배웠다.