결국엔 푼다고 ~!
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/120812
import java.util.*;
class Solution {
public int solution(int[] array) {
int answer = 0;
Map<Integer, Integer> myMap = new HashMap<>();
for (int i : array) {
myMap.put(i, myMap.getOrDefault(i, 0) + 1);
}
System.out.print(myMap);
Iterator<Integer> k_iter = myMap.keySet().iterator();
Iterator<Integer> v_iter = myMap.values().iterator();
int max = v_iter.next();
int it = 0;
int max_k = k_iter.next();
int k = 0;
while (v_iter.hasNext()) {
it = v_iter.next();
k = k_iter.next();
if (max < it) {
max = it;
max_k = k;
}
}
Iterator<Integer> v_chk = myMap.values().iterator();
int count = 0;
while (v_chk.hasNext()) {
if (max == v_chk.next()) {
count++;
}
}
if (count > 1) {
max_k = -1;
}
answer = max_k;
return answer;
}
}
이 문제는 코테 풀이를 처음 시작할 때 시도했다가 (해시맵을 몰라서) 실패했던 문제댜!
11월 18일에 처음 풀다가 답답했지만! 그래도 최대한 혼자 풀려고 아껴뒀던 문제다.
오늘 해시맵을 배우고 집 오는 길에 왠지 풀 수 있을 것 같다는 생각에 바로 도전🤓
바로 풀었죠?
1) 해시맵을 사용해서 key를 배열에 존재하는 숫자로, value를 그 숫자의 빈도수로 지정했다.
2) 한 가지 추가적으로 생각해야 했던 부분은 몇 번 나타나는지 그 값을 리턴하는 게 아닌, 어떤 숫자가 가장 많이 나타나는지, 즉 value를 통해서 최댓값 (max) 을 찾고 그 최댓값을 가진 key를 결국엔 찾아내야 했다.
3) 그래서 Iterator를 두 개 설정해서 k_iter는 key를, v_iter는 value를 iterate할 수 있게 지정했다.
4) v_iter로 max값을 찾아내고 k_iter도 함께 next() 메소드를 실행하면서 v_iter랑 같이 움직일 수 있게 했다.
*여기서 k_max는 max값에 해당하는 value를 가진 key이다.
5) 마지막엔 최빈값이 없을 경우, 즉 최댓값을 가진 key가 여러 개 있을 경우는 -1를 리턴해야 했기에 새로운 Iterator를 설정해서 max를 가진 key의 개수를 count로 세줬다.
6) count 자체의 값이 1보다 크면 최빈값이 하나가 아니라는 뜻이기에 answer=-1로 지정해줬다.
오늘 수업 때 해시맵에서 약간 정신을 놓을 뻔했지만 집에 와서 이런 저런 문제 좀 풀어보니까 어떤 식으로 알고리즘을 짜야하는지 살짝 감이 오는 것 같다.
저번에 어려워서 못 풀겠다고 바로 답지 안 보고 아껴둔 나에게 무한 칭찬을😏✨