https://school.programmers.co.kr/learn/courses/30/lessons/120812

문제

image

풀이과정

  1. 매개변수로 주어진 array 배열에서 중복값을 제거한 배열 setArr 선언.
  2. setArr의 길이(=set의 크기)만큼 반복하면서 매개변수 arrayArrayList로 변환한 list(Collections 클래스를 사용하기 위함)에서 각각의 setArr의 원소와 일치하는 원소의 개수를 result 배열에 담음.
  3. max : result 배열에서 가장 큰 수.
  4. result 배열에서 max와 일치하는 index를 가져오고, setArr에서 해당 index의 값을 가져온 게 최빈값.
  5. result 배열에서 max 값이 2개 이상이면 -1 리턴.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.*;

class Solution {
    public int solution(int[] array) {
        int answer, max = 0;
        
        Integer[] arr = Arrays.stream(array).boxed().toArray(Integer[]::new);
        List<Integer> list = new ArrayList<>(Arrays.asList(arr));
        Set<Integer> set = new HashSet<>(Arrays.asList(arr));
        Integer[] setArr = set.toArray(new Integer[0]);
        List<Integer> result = new ArrayList();
        
        for(int i=0; i<set.size(); i++) {
            result.add(i, Collections.frequency(list, setArr[i]));
        }
        
        max = Collections.max(result);
        
        if(Collections.frequency(result, max) >= 2)
            answer = -1;
        else
            answer = setArr[result.indexOf(max)];
        
        return answer;
    }
}

다른 사람 코드 분석

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.*;
class Solution {
    public int solution(int[] array) {
        int maxCount = 0;
        int answer = 0;
        Map<Integer, Integer> map = new HashMap<>();
        for(int number : array){
            int count = map.getOrDefault(number, 0) + 1;
            if(count > maxCount){
                maxCount = count;
                answer = number;
            }
            else  if(count == maxCount){
                answer = -1;
            }
            map.put(number, count);
        }
        return answer;
    }
}
  1. 주어진 매개변수 array 배열의 원소마다 count한 값이 들어가야 하는 것이므로 HashMap을 사용해 array의 원소를 key로, 해당 원소를 count한 값 countvalue로 가지는 map을 생성해 사용.
    map.put(number, count);
  2. array의 길이만큼 for문 순회.
  3. int count = map.getOrDefault(number, 0) + 1;
    image
    ⇒ 첫 번째 매개변수의 key가 매핑되어 있으면 해당 keyvalue를 리턴하고, 그렇지 않으면 두 번째 매개변수의 값을 리턴.
    ex) int[] array = {1, 2, 3, 3, 3, 4};
    image
  4. 첫 for문 시작시 map에는 값이 들어있지 않으므로 count = 0 + 1 = 1;
  5. 반복문을 수행하면서 numbercountmap에 추가함.
    number가 map에 있으면 count = 해당number + 1;
    ⇒ map에 재할당
  6. 첫 for문 순회시 maxCount = count = 1;
  7. countmaxCount(=1)보다 크면 maxCount = count;
    answer = number;
  8. 계속 for문 순회하다가 다른 numbercountmaxCount값과 같으면 최빈값이 두 개 이상이 되므로 answer = -1;