이 문제에서 제일 중요한 것은 최빈값을 구하는 로직이 아닐까 싶다.
음.. 최빈값은 어떻게 구하지?
int maxFreq = 0;
for (int freq : countArr) {
if (freq > maxFreq) maxFreq = freq;
}
이 코드의 역할
: 배열 전체를 순회하면서 등장 횟수가 가장 큰 값을 maxFreq 에 저장하는 코드
최빈 숫자를 찾는 게 아니라 최빈 횟수를 구하는 것.
최빈값 구하는 코드
int[] countArr = new int[8001]; // -4000 ~ 4000 → 8001 크기
// 카운팅
for (int i = 0; i < N; i++) {
countArr[arrays[i] + 4000]++; // 인덱스 보정
}
// 최대 빈도 찾기
int maxFreq = 0;
for (int freq : countArr) {
if (freq > maxFreq) maxFreq = freq;
}
// 최대 빈도 가진 값들 수집
List<Integer> modeList = new ArrayList<>();
for (int i = 0; i < countArr.length; i++) {
if (countArr[i] == maxFreq) {
modeList.add(i - 4000); // 다시 원래 값으로 보정
}
}
// 최빈값 결정
int mode;
if (modeList.size() == 1) {
mode = modeList.get(0);
} else {
Collections.sort(modeList);
mode = modeList.get(1); // 두 번째로 작은 값 출력
}
map으로도 구할 수 있다. 근데 이 문제에서는 조건에 4000이하라는 것이 있으므로 위 코드처럼 푸는 게 더 좋다.
Collections.sort(list)
대상: List
계열 (예: ArrayList
, LinkedList
)
정렬 대상: List<T>
— 즉 객체 컬렉션
사용 예시:
List<Integer> list = new ArrayList<>();
Collections.sort(list); // 오름차순 정렬
특징:
list.sort(null)
호출함 (즉, Comparator
가 없으면 기본 정렬)List
의 정렬은 내부적으로 TimSort 알고리즘을 사용 (안정 정렬)Collections.sort(list, comparator)
Arrays.sort(array)