[SW Expert Academy] 1204. [S/W 문제해결 기본] 1일차 - 최빈수 구하기

사용 언어 : JAVA

결과

  • 메모리 : 25,104 kb
  • 실행 시간 : 168 ms
  • 코드 길이 : 2,770

풀이

package level_2;

import java.util.*;

public class java_1204 {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int T = sc.nextInt();
        int num = sc.nextInt();

        for (int i = 1; i <= T; i++) {

            sc.nextLine();

            String str = sc.nextLine();
            String[] str_arr = str.split(" ");
            
            // 0부터 100까지 점수 (빈도 표시 배열)
            int counts[] = new int[101];

            // 학생의 점수 배열에서 반복문을 실행하여 빈도를 추가한다. 이때 counts의 index값이 점수가 된다.
            for (int j = 0; j < str_arr.length; j++) {
                int n = Integer.parseInt(str_arr[j]);
                counts[n] += 1;
            }
            

            // 가장 높은 빈도를 나타내기 위한 반복문
            int max = 0;
            int maxIndex = 0;

            for (int j = 0; j < counts.length - 1; j++) {
            	
                if (counts[j] >= max && j > maxIndex) {
                	max = counts[j];
                	maxIndex = j;

                }
            }
            
            System.out.println("#"+i+" "+maxIndex);

        }
    }
}

주석

- 역시 lv 1이랑은 다르다. 조금 더 생각해야 하는 문제가 나왔다.

- 로직을 조금 복잡하게 짰다고 볼 수도 있을텐데, 이 문제가 아닌 다른 문제에서 응용을 쉽게 하기 위함이다.

  • 학생의 점수 값을 String[] str_arr로 받아와 배열화하여 int로 전환한 부분 -> int counts[] 부분처럼 int student[] = new int[1000]; 이렇게 할 수도 있으나 만약 1000개의 값이 안 나온다면? 사용자의 실수로 한 개가 누락된다면? 이런 경우도 고려해야하기 때문에 문자열로 받아와 배열화했다. 
  • 최빈도에 해당하는 점수를 구하는 문제이지만, 최빈도가 궁금해질 수도 있기 때문에 max도 설정했다.

- if (counts[j] >= max && j > maxIndex) { : 이 부분에서 꼭 counts[j] >= max 로 설정해주어야 한다. 만약 최빈도가 같은 점수가 여러 개 있을 경우, counts[j] > max로 해버리면 조건에 부합하지 않는 결과가 나온다.