알고리즘 최빈값 문제를 풀면서 발생했던 시행착오와 해결 과정을 기록한다.
최빈값이 무엇이냐?
배열 안에서 가장 많이 등장하는 값을 반환해준다.
예를 들어
1, 1, 3, 3, 3, 4
라는 배열이 있을 때
3이 최빈 값이 된다.
왜냐하면 3이 3개이기 때문이다.
나는 이 문제를 풀이할 때 map을 사용했었는데,
최빈값을 구할 때 실수로 key 값으로 비교를 해가지고, key 값이 가장 큰 경우를 반환해버리는 일이 발생했다.
이 사실을 인지하는데 아주 오랜 시간이 걸렸다.. 후...
예를 들어
1, 1, 44, 44, 5,5,5
배열에서 5가 최빈 값이 되어야 하는데
44를 반환해버리는 불상사가 발생했다.
이 문제는 아래 코드에서 발생했다.
int max = 0;
for (int x : array) {
map.put(x, map.getOrDefault(x, 0) + 1);
int mapGet = map.get(x);
if(mapGet > max){ // 여기서 문제 발생
max = x;
}
}
위 코드를 아래와 같이 수정해주면 된다.
int max = 0;
int maxCount = 0;
for (int x : array) {
map.put(x, map.getOrDefault(x, 0) + 1);
int mapGet = map.get(x);
if(mapGet > maxCount){ // 여기서 문제 발생
maxCount = mapGet;
max = x;
}
}
전체 코드는 아래와 같다.
public int solution(int[] array) {
int answer = 0;
HashMap<Integer, Integer> map = new HashMap<>();
int max = 0;
int maxCount = 0;
for (int x : array) {
map.put(x, map.getOrDefault(x, 0) + 1);
int mapGet = map.get(x);
if(mapGet > max){
// maxCount = mapGet;
max = x;
}
}
int cnt = 0;
for(int x : map.values()){
if(x == map.get(max)){
cnt++;
}
}
if(cnt > 1){
return -1;
}
answer = max;
return answer;
}
최빈값의 개념을 알게되었다.