낭 만 당

프로그래머스 Lv:0 최빈값 구하기 본문

Programming Record

프로그래머스 Lv:0 최빈값 구하기

낭만알파카 2024. 11. 26. 21:57
최빈값 구하기 문제 해설

최빈값 구하기

이 문서는 JavaScript로 최빈값을 구하는 문제를 해결하는 과정을 설명한다. 최빈값은 데이터에서 가장 자주 나타나는 값을 의미하고, 주어진 문제의 조건과 제한사항을 바탕으로 최적의 알고리즘을 구현한다.

문제 설명

  • 정수 배열 array가 매개변수로 주어짐.
  • 최빈값을 계산하여 반환하기
  • 최빈값이 여러 개라면 -1을 반환.
  • 제한사항:
    • 0 < array.length < 100
    • 0 ≤ array[i] < 1000

입출력 예

입력 배열 (array) 출력값 (result)
[1, 2, 3, 3, 3, 4] 3
[1, 1, 2, 2] -1
[1] 1

문제를 해결하는 과정

  1. 빈도 계산: 배열의 각 요소가 몇 번 등장했는지를 객체를 사용하여 기록한다.
  2. 최빈값 찾기: 빈도가 가장 높은 값을 찾고, 그 값이 유일한지 확인한다.
  3. 조건 처리: 최빈값이 유일하면 그 값을 반환하고, 여러 개라면 -1을 반환한다.

사용된 문법 설명

  • for ... of: 배열의 요소를 하나씩 순회하는 반복문.
  • Object.entries(): 객체의 키-값 쌍을 배열 형태로 반환하는 메서드.
  • 삼항 연산자: 조건 ? 참일 때 값 : 거짓일 때 값 형태로 사용.
  • parseInt(): 문자열을 정수로 변환하는 함수.

알고리즘 구현


function solution(array) {
    // Step 1: 빈도 계산
    const frequencyMap = {};
    for (const num of array) {
        frequencyMap[num] = (frequencyMap[num] || 0) + 1;
    }

    // Step 2: 최빈값 및 최대 빈도 찾기
    let maxFrequency = 0;
    let mode = -1;
    let isUnique = true; // 최빈값이 유일한지 확인

    for (const [num, frequency] of Object.entries(frequencyMap)) {
        if (frequency > maxFrequency) {
            maxFrequency = frequency;
            mode = parseInt(num);
            isUnique = true; // 새로운 최빈값 갱신
        } else if (frequency === maxFrequency) {
            isUnique = false; // 최빈값이 여러 개일 경우
        }
    }

    // Step 3: 결과 반환
    return isUnique ? mode : -1;
}

    

테스트 케이스


console.log(solution([1, 2, 3, 3, 3, 4])); // 3
console.log(solution([1, 1, 2, 2]));       // -1
console.log(solution([1]));                // 1

    

결론

위 코드는 시간 복잡도 O(n)으로 효율적으로 동작한다⭐ 배열을 한 번 순회하여 빈도를 계산하고, 객체를 순회하여 최빈값을 찾습니다. 이 알고리즘은 문제의 제한사항 내에서 빠르게 작동하며, 최적화된 방법론을 따른다.