코테연습/프로그래머스
코딩테스트 입문 > 최빈값 구하기
메각이
2024. 12. 19. 15:25
728x90
오랜만에 진행한 코딩테스트....
입문 문제 이게 맞나.... ? 3시간 가까이 걸린....
각 풀이과정은 주석을 통해 작성했다
다소 직관적일 수 있다는 점 ㅜㅜ
느낀점은 step by step 이 중요하다는 점이다
손코딩을 통해 실제로 내가 어떻게 비교하는지 로직 생각 -> 코드로 풀어쓰기
import java.util.*;
class Solution {
public int solution(int[] array) {
// 배열이 하나일경우 최빈값 바로 반환
if(array.length == 1) return array[0];
Map<Integer, Integer> maxMap = new HashMap<>();
// Step 1: 배열 정렬
Arrays.sort(array);
// Step 2: HashMap에 각 숫자의 빈도 계산
for (int i = 0; i < array.length - 1; i++) {
int count = 1; // 초기화
while (array[i] == array[i + 1]) {
count++;
i++;
if (i + 1 == array.length) break; // 마지막 숫자라면 루프 종료
}
maxMap.put(array[i], count); // 숫자와 빈도를 맵에 저장
}
// Step 3: 최빈값 찾기
int maxCount = 1; // 최대 빈도
int mode = -1; // 최빈값
boolean isMultiple = false; // 최빈값이 여러 개인지 여부
// HashMap을 순회하며 최대 빈도와 최빈값을 구함
for (Map.Entry<Integer, Integer> entry : maxMap.entrySet()) {
int key = entry.getKey(); // 현재 숫자
int value = entry.getValue(); // 현재 숫자의 빈도
// 현재 숫자의 빈도가 기존 최대 빈도보다 큰 경우
if (value > maxCount) {
maxCount = value; // 최대 빈도를 갱신
mode = key; // 최빈값을 갱신
isMultiple = false; // 최빈값이 갱신되었으므로 중복 상태를 초기화
}
// 현재 숫자의 빈도가 기존 최대 빈도와 같은 경우
else if (value == maxCount) {
isMultiple = true; // 최빈값이 여러 개임을 표시
}
}
// 최빈값이 여러 개인 경우 -1 반환
if (isMultiple) {
return -1;
}
// 최빈값 반환
return mode;
}
}
728x90