최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
지난 문자열 묶기 문제를 풀이하며 HashMap을 배웠던 게 생각이 나서 활용해 보기로 했다. array 배열의 원소들을 key로 삼고, 카운트 한 개수를 value로 하면 될 것 같았다.
확장 for문으로 꺼낸 다음, 해당 원소를 key로 값이 나올 때마다 put() 해준다. 이때 getOrDefault()로 key에 해당하는 값이 없다면 디폴트 값인 0을 반환하게 한 뒤 +1 하도록 한다. HashMap은 동일한 키의 값을 추가할 경우 Value를 덮어쓰기 하므로, 새로 등장하는 원소와 등장했던 원소를 getOrDefault()로 구분해 값을 저장해줄 수 있다.
다음은 최빈값을 구하기 위해 필요한 변수들이다.
int mode = 0;: 최빈값을 담을 변수
int maxCount = 0;: 최빈값의 등장 횟수
boolean multiple = false;: 최빈값이 여러 개인지 체크할 플래그
여기서 우리가 체크할 점은 우리가 구해야 할 최빈값은 map의 value가 아니라 key라는 점이다. 따라서 values()가 아닌 keySet()으로 key 값부터 먼저 꺼낸 다음, 최빈값인지 체크하기 위해 get()으로 key에 해당하는 value들을 반환 받아야 한다.
그 후에 if(count > maxCount) 조건문을 활용해 maxCount보다 큰 값일 경우
mode 변수에 최빈값 저장, maxCount 변수에 빈도수 저장, 플래그는 false로 유지한다.
이 과정을 반복하며 최빈값과 그에 해당하는 빈도수를 int mode와 int maxCount에 담을 수 있게 된다.
그리고 문제에 따라, 만약 count == maxCount라면 플래그를 true로 변경해 준다. 반환 시 삼항 연산자에 따라 플래그가 true라면 -1을, false라면 최빈값인 mode를 return한다.
→ return multiple ? -1 : mode;
import java.util.HashMap;
class Solution {
public int solution(int[] array) {
HashMap<Integer, Integer> countMap = new HashMap<>();
for (int num : array) {
countMap.put(num, countMap.getOrDefault(num, 0) + 1);
}
int mode = 0;
int maxCount = 0;
boolean multiple = false;
for (int num : countMap.keySet()) {
int count = countMap.get(num);
if (count > maxCount) {
mode = num;
maxCount = count;
multiple = false;
} else if (count == maxCount) {
multiple = true;
}
}
return multiple ? -1 : mode;
}
}
