프로그래머스 코딩(자바)/Level 0

Programmers Level 0 - 최빈값 구하기

kjwc 2023. 3. 7. 15:16
728x90

문제 설명

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.

 
제한사항
  • 0 < array의 길이 < 100
  • 0 ≤ array의 원소 < 1000

 

입출력 예
array result
[1, 2, 3, 3, 3, 4] 3
[1, 1, 2, 2] -1
[1] 1

입출력 예 설명

입출력 예 #1

  • [1, 2, 3, 3, 3, 4]에서 1은 1개 2는 1개 3은 3개 4는 1개로 최빈값은 3입니다.

입출력 예 #2

  • [1, 1, 2, 2]에서 1은 2개 2는 2개로 최빈값이 1, 2입니다. 최빈값이 여러 개이므로 -1을 return 합니다.

입출력 예 #3

  • [1]에는 1만 있으므로 최빈값은 1입니다.

 

※ 공지 - 2022년 10월 17일 제한 사항 및 테스트케이스가 수정되었습니다.

 

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
class Solution {
    public int solution(int[] array) {
        int answer = 0;
        // 원소 값이 1~999까지 이므로 1000개 배열
        int ar[] = new int[1000]; 
        // 각각 숫자의 나타난 빈도를 구한다.
        for(int n : array) ar[n]++
        // 빈도의 최대값과 최빈값을 구한다.
        int max = ar[0], index=0;
        for(int i=0;i<ar.length;i++) {
            if(max<ar[i]) {
                max = ar[i];
                index = i; // 위치의 첨자가 최빈값이다.
            }
        }
        // 조건에 최빈값2개 이면 -1을 리턴하도록 최빈값의 개수를 구한다.
        int count = 0;
        for(int i=0;i<ar.length;i++) {
            if(max == ar[i]) count++;
        }
        // 최빈 값이 2개면 -1을 아니면 최빈값을 리턴한다.
        answer = count>1 ? -1 : index;
        return answer;
    }
}
cs

 

다른 사람의 풀이 Map을 이용!!!

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
27
28
29
class Solution {
    public int solution(int[] array) {
        // 빈도수의 최대값을 구할 변수
        int max = 0
        // 최빈값
        int answer = 0;   
        // 맵선언
        Map<Integer, Integer> map = new HashMap<>(); 
        // 배열 반복
        for(int number : array){
            // 맵에서 숫자의 빈도수를 얻어온다. 
            // 키가 없을 경우 0을 가지게하기 위해 getOrDefault()사용
            int count = map.getOrDefault(number, 0+ 1;
            // 최대값을 구한다.
            if(count > max){
                // 최대 빈도수
                max = count; 
                // 이때의 숫자 즉 최빈값 
                answer = number;
            // 최대값이 같으면 즉, 최빈값이 여러개면 -1    
            } else  if(count == max){
                answer = -1;
            }
            // 맵에 넣는다.
            map.put(number, count);
        }
        return answer;
    }
}
cs

 

다른 사람의 풀이 Stream을 이용!!!

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class Solution {
    public int solution(int[] array) {
        // 값을 기준으로 그룹을 잡아 값을 키로 리스트를 value로 하는 Map생성
        Map<Integer, List<Integer>> map = Arrays.stream(array).boxed().collect(Collectors.groupingBy(o -> o));
        // System.out.println(map);
        // 리스트이 개수로 내림 차순 정렬한다.
        List<Map.Entry<Integer, List<Integer>>> list = map.entrySet().stream()
                .sorted((t0, t1) -> Integer.compare(t1.getValue().size(), t0.getValue().size()))
                .collect(Collectors.toList());
        // System.out.println(list2);
        // 상위 2개 리스트의 개수가 같다면 최빈값이 2개이상이므로 -1을 아니면 첫번째 키를 최빈값으로 가진다.
        int answer = list.size() > 1 && list.get(0).getValue().size() == list.get(1).getValue().size() 
                     ? -1 : list.get(0).getKey();
        // System.out.println(answer);
        // System.out.println("-".repeat(80));
         return answer;
    }
}
cs

 

728x90