[코테 풀이] 최빈값 구하기

시내·2023년 12월 12일
0

결국엔 푼다고 ~!

Q) 최빈값 구하기

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 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로 지정해줬다.

오늘 수업 때 해시맵에서 약간 정신을 놓을 뻔했지만 집에 와서 이런 저런 문제 좀 풀어보니까 어떤 식으로 알고리즘을 짜야하는지 살짝 감이 오는 것 같다.

저번에 어려워서 못 풀겠다고 바로 답지 안 보고 아껴둔 나에게 무한 칭찬을😏✨

profile
contact 📨 ksw08215@gmail.com

0개의 댓글