문제 상세 설명1000명의 학생의 점수를 토대로 최빈수를 구하는 문제, 다만, 최빈수가 여러개인 경우 가장 큰 점수를 출력
어느 고등학교에서 실시한 1000명의 수학 성적을 토대로 통계 자료를 만들려고 한다.
이때, 이 학교에서는 최빈수를 이용하여 학생들의 평균 수준을 짐작하는데, 여기서 최빈수는 특정 자료에서 가장 여러 번 나타나는 값을 의미한다.
다음과 같은 수 분포가 있으면,
10, 8, 7, 2, 2, 4, 8, 8, 8, 9, 5, 5, 3
최빈수는 8이 된다.
최빈수를 출력하는 프로그램을 작성하여라 (단, 최빈수가 여러 개 일 때에는 가장 큰 점수를 출력하라).
[제약 사항]
학생의 수는 1000명이며, 각 학생의 점수는 0점 이상 100점 이하의 값이다.
[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 줄에는 테스트 케이스의 번호가 주어지고 그 다음 줄부터는 점수가 주어진다.
[출력]
#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스에 대한 답을 출력한다.
| 입력 | 출력 |
|---|---|
| 10 1 41 85 72 38 80 69 65 68 96 22 49 67 51 61 63 87 66 24 80 83... 생략 | #1 71 #2 76 |
package D2;
//SWEA D2 2001번 "최빈수 구하기" 문제 풀이
import java.util.*;
public class N1204 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
StringBuilder result = new StringBuilder();
for (int i = 1; i <= T; i++) {
int n = scanner.nextInt();
int[] score = new int[1000];
for(int j = 0; j < 1000; j++) {
score[j] = scanner.nextInt();
}
result.append(String.format("#%d %d\n", i, solution(score)));
}
System.out.print(result);
scanner.close();
}
public static int solution(int[] score) {
// key는 점수, value는 그 점수의 개수
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : score) {
// map에 이미 존재하는 점수라면 해당 점수의 value값을 불러와서 1 증가시킨다.
if (map.containsKey(num)) {
map.put(num, map.get(num) + 1);
// map에 존재하지 않는 점수라면 새로운 key로 값을 넣는다.
} else {
map.put(num, 1);
}
}
// 최빈값 구하기
int max_key = 0;
int max_val = 0;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
int key = entry.getKey();
int val = entry.getValue();
// 최빈값을 구한다.
if (max_val < val) {
max_val = val;
max_key = key;
//만약 최빈값이 같다면 둘 중 큰 수로 저장한다.
}else if (max_val == val) {
max_key = Math.max(entry.getKey(), max_key);
max_val = map.get(max_key);
}
}
return max_key;
}
}
package D2;
//SWEA D2 2001번 "최빈수 구하기" 문제 풀이 개
import java.util.*;
public class N1204_b {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
StringBuilder result = new StringBuilder();
for (int i = 1; i <= T; i++) {
int n = scanner.nextInt();
int[] scores = new int[101]; // 점수는 0 ~ 100 범위
for (int j = 0; j < 1000; j++) {
int score = scanner.nextInt();
scores[score]++; // 각 점수의 빈도 증가
}
result.append(String.format("#%d %d\n", i, solution(scores)));
}
System.out.print(result);
scanner.close();
}
public static int solution(int[] scores) {
int maxScore = 0; // 최빈수 중 가장 큰 점
int maxFrequency = 0; // 최빈수의 빈도
for (int score = 0; score <= 100; score++) {
if (scores[score] > maxFrequency) {
maxFrequency = scores[score];
maxScore = score;
}else if (scores[score] == maxFrequency && score > maxScore) { // 빈도가 같으면 더 큰 점수를 선택
maxScore = score;
}
}
return maxScore;
}
}
점수 배열의 길이 최적화
기존 코드는 int[] score = new int[1000]; 으로 1000명 학생의 점수를 모두 배열에 저장했지만, 실제 점수는 0부터 100까지의 값이므로 배열의 범위를 new int[101]로 제한할 수 있다.
HashMap대신 int[] 사용
기존 코드에서는 점수별 빈도수를 저장하기 위해 HashMap을 사용했었는데 배열을 사용해 더 효율적으로 저장할 수 있다. 만약 80점이 두개 있다면 score[80] 에 2를 저장하면 된다.