프로그래머스 코딩(자바)/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