프로그래머스/Lv. 0(코딩테스트 입문)

[프로그래머스 코딩테스트] 최빈값 구하기(Java)

Sigfriede 2023. 3. 23. 00:59

  문제 설명

  최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 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
class Solution {
    public int solution(int[] array) {
        int answer = 0;
        int[] index = new int[1001];
        int max = Integer.MIN_VALUE;
        
        for(int i = 0; i < array.length; i++) {
            index[array[i]]++;
        }
        
        for(int i = 0; i < index.length; i++) {
            if (index[i] > max) {
                max = index[i];
                answer = i;
            } else if (max == index[i]) {
                answer = -1;
            }
        }
        return answer;
    }
}
int[] array = [1, 2, 3, 3, 3, 4]
int[] index = [0, 1, 1, 3, 1….]

 

  제가 최빈값 풀이를 이해한 바로는 이렇습니다(아닐 수도 있습니다! 틀릴 시 댓글 부탁드립니다!). 우선 for문이 array.length만큼 순회하면서 index에 값을 증가시킵니다. 위의 문장이 예시 배열이고, 아래 문장이 예시 배열을 카운트한 후의 index입니다. 원소가 1부터 시작하기 때문에 index[0]은 비어있고, index[1] = 1(배열에서 1이 한 개 뿐이므로), index[2] = 1, index[3] = 3, index[4] = 1. 이런 식으로 각 수의 개수와 index를 매핑시키는 것입니다. int를 1001로 설정한 것 역시 array의 원소값을 염두에 두고 설정한 것입니다. (그런데 100으로 설정해도 통과되고 다른 사람의 풀이를 보면 2000씩 설정하신 분도 있던데 정확한 이유는 모르겠습니다.)

  이후 for문으로 index를 순회하면서 index에서 i번째 값이 최대값보다 크다면 최대값을 i번째 값으로 변경하는 식으로 가장 큰 값을 찾습니다. index에서 가장 큰 값의 위치와 최빈값은 동일한 값이므로 정답을 추론할 수 있습니다.

  else if 부터는 최빈값이 여러 개일 때 -1을 리턴합니다. max값과 index[i]의 값이 같다면 최빈값이 여러 개라는 뜻이겠죠. 여기서 max값을 0이 아닌 Integer.MIN_VALUE를 사용하는 이유는, 변수가 최소값보다 작은 값을 가질 수 있는 경우(특히 음수) 이렇게 초기화함으로써 변수가 유효하지 않은 값을 가지는 것을 방지할 수 있기 때문입니다.

  이 풀이와 유사하게 HashMap을 써서 푸는 법도 있는 듯 한데, 저는 애송이라 아직 잘 모르겠습니다. 나중에 알게되면 추가하도록 하겠습니다. 코드만 보면 단순해보이는 문제인데, 상당히 어렵네요. 이해가 잘 안 돼서 계속 들여다 봤습니다. 이게 3일차 문제…?