개발에 AtoZ까지

[JAVA][D2] 1204. 최빈수 구하기 본문

코딩테스트 준비/SWEA

[JAVA][D2] 1204. 최빈수 구하기

AtoZ 개발자 2021. 1. 11. 22:42
반응형

문제 

어느 고등학교에서 실시한 1000명의 수학 성적을 토대로 통계 자료를 만들려고 한다.

이때, 이 학교에서는 최빈수를 이용하여 학생들의 평균 수준을 짐작하는데, 여기서 최빈수는 특정 자료에서 가장 여러 번 나타나는 값을 의미한다.

다음과 같은 수 분포가 있으면,

10, 8, 7, 2, 2, 4, 8, 8, 8, 9, 5, 5, 3

최빈수는 8이 된다.

최빈수를 출력하는 프로그램을 작성하여라 (단, 최빈수가 여러 개 일 때에는 가장 큰 점수를 출력하라).

[제약 사항]

학생의 수는 1000명이며, 각 학생의 점수는 0점 이상 100점 이하의 값이다.
 
[입력]

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

각 테스트 케이스의 첫 줄에는 테스트 케이스의 번호가 주어지고 그 다음 줄부터는 점수가 주어진다.

[출력]

#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스에 대한 답을 출력한다.

예시

 

풀이

1번 풀이법)

HashMap을 사용하여 정렬을 하지 않은 경우(단, 이럴 경우에는 Key값이 정렬되어 있지 않기 때문에 숫자의 반복횟수가 같은 경우에는 

기존에 result값과 현재 Key값을 비교하여 최대값으로 구해준다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.TreeMap;

public class Solution {
	public static void main(String[] args) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		try {
			int T = Integer.parseInt(br.readLine());
			// 테스트케이스 반복
			for (int i = 1; i <= T; i++) {
				int caseNum = Integer.parseInt(br.readLine());
				//숫자값을 Key로 하고 그 숫자값의 반복횟수를 Value로 하는 Map 구조 활용
				Map<Integer, Integer> map = new HashMap<Integer, Integer>();
				StringTokenizer st = new StringTokenizer(br.readLine()," ");
				while(st.hasMoreTokens()) {
					int num =Integer.parseInt(st.nextToken());
					//map에 넣을때 숫자값으로 하는 key값이 있다면 해당 키값을 불러와 +1를 한다.
					map.put(num, map.getOrDefault(num, 0)+1);
				}
				//숫자값
				int result=0;
				//숫자가 반복된 횟수의 최대값
				int max=0;
				for(int b:map.keySet()) {
					if(max==0) {
						max=map.get(b);
					}
					else if(max<=map.get(b)) {
						max = map.get(b);
						//횟수가 같을때에는 key값이 큰것으로 한다.
						if(max==map.get(b)) {
							result=Math.max(result, b);
						}
						else {
							result=b;
						}
					}
				}
				
				System.out.println("#" + caseNum + " " +result);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

2번 풀이법)

1번의 불편한점을 해결하기 위해 Map을 정렬할 수 있는 TreeMap을 사용한다

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.TreeMap;
 
public class Solution {
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try {
            int T = Integer.parseInt(br.readLine());
            // 테스트케이스 반복
            for (int i = 1; i <= T; i++) {
                int caseNum = Integer.parseInt(br.readLine());
                Map<Integer, Integer> map = new HashMap<Integer, Integer>();
                StringTokenizer st = new StringTokenizer(br.readLine()," ");
                while(st.hasMoreTokens()) {
                    int num =Integer.parseInt(st.nextToken());
                    map.put(num, map.getOrDefault(num, 0)+1);
                }
                int result=0;
                int max=0;
                for(int b:map.keySet()) {
                    if(max==0) {
                        max=map.get(b);
                    }
                    else if(max<=map.get(b)) {
                        max = map.get(b);
                        if(max==map.get(b)) {
                            result=b;
                        }
                        else {
                            result=b;
                        }
                    }
                }
                 
                System.out.println("#" + caseNum + " " +result);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
반응형
Comments