[SWEA] D2 - 1204번 | 최빈수 구하기

EllievV·2024년 11월 14일

🐊 CodingTest

목록 보기
12/18

🔍 문제 보러 가기

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;
	}
}

접근 방법

  1. 1000개의 점수를 입력받아 배열에 저장한다.
  2. HashMap을 사용하여, 각 점수를 키(key)로 하고 해당 점수의 출현 빈도를 값(value)으로 저장한다.
  3. 점수가 저장된 배열을 순회하며, 각 점수를 HashMap에 넣고 해당 점수의 개수를 1씩 증가시킨다.
  4. HashMap을 순회하여 최빈값을 찾는다. 최빈값이 여러 개라면, 그중 가장 큰 점수를 선택한다.

개선 코드

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;
		
	}
}

point

  1. 점수 배열의 길이 최적화

    기존 코드는 int[] score = new int[1000]; 으로 1000명 학생의 점수를 모두 배열에 저장했지만, 실제 점수는 0부터 100까지의 값이므로 배열의 범위를 new int[101]로 제한할 수 있다.

  2. HashMap대신 int[] 사용

    기존 코드에서는 점수별 빈도수를 저장하기 위해 HashMap을 사용했었는데 배열을 사용해 더 효율적으로 저장할 수 있다. 만약 80점이 두개 있다면 score[80] 에 2를 저장하면 된다.

0개의 댓글