https://swexpertacademy.com/main/solvingProblem/solvingProblem.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문제를 푸는 것에 있어서 가장 핵심은 배열의 index의 활용이다.

점수는 0점~100점, 점수들 중에서 최빈값을 구하는 것.

예를들어, 각 점수마다 임의로 빈도수를 나타낸다고 가정해보자.

0점 1점 2점 3점 4점 ...  98점 99점 100점

1번 4번 6번 2번 5번 ...  3번   20번     1번

위 두 줄을 보면 뭐가 떠오르는가? 

"배열의 원소와 각 원소에 대한 인덱스"

즉, 점수마다의 빈도수를 원소로 갖고, 인덱스 번호가 0부터 100까지 존재하는 배열을 이용하면 되지 않을까?라는 생각.

 

이제 작성한 코드를 살펴보자.

 

1. 첫번째 풀이(비효율적인 부분이 있으나 생각의 흐름이 모두 드러나있는 풀이)

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
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.util.Scanner;
 
public class Solution {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
 
        for (int k = 0; k < T; k++) {
            int t = sc.nextInt();
            //1000명의 학생의 점수 입력
            int[] arr = new int[1000];
            for (int i = 0; i < arr.length; i++) {
                arr[i] = sc.nextInt();
            }
            //0점 ~ 100점의 빈도수를 셀 배열 생성
            int[] cnt = new int[101]; // 0점 ~ 100점(배열의 길이: 101)
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < 101; j++) {
                    if (arr[i] == j) {
                        cnt[j]++;
                    }
                }
            }
            //가장 큰 빈도수를 찾아, 그 빈도수에 해당되는 점수(인덱스) 출력하기
            //이때, 가장 큰 빈도수가 여러 개이면 가장 높은 점수를 출력해야하는데,
            // 아래 max, cnt[i] 비교시 <만 입력하게 되면, 더 높은 점수(인덱스)에서 동일한 빈도수를 가지더라도 출력이 안되므로
            // max <= cnt[i]로 처리한다.
            int max = cnt[0];
            int answer = 0;
            for (int i = 0; i < cnt.length; i++) {
                if (max <= cnt[i]) { 
                    max = cnt[i];
                    answer = i;
                } 
            }
            System.out.println("#" + t + " " + answer);
        }
    }
 
}
 
cs

2. 비효율적인 부분을 줄인 풀이

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
30
import java.util.Scanner;
 
public class Solution {
 
    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
 
        for (int k = 0; k < T; k++) {
            int t = sc.nextInt();
            //점수 입력 및 빈도수 배열 생성, 빈도수 나타내기
            int[] cnt = new int[101];
            for (int i = 0; i < 1000; i++) {
                int score = sc.nextInt();
                cnt[score]++;
            } 
            //가장 큰 빈도수 찾아, 점수 출력하기
            int maxScore = 0;
            for(int score=0; score<cnt.length; score++){
                if(cnt[maxScore] <= cnt[score]) {
                    maxScore = score; 
                }
            }
            System.out.println("#" + t + " " + maxScore);
        } 
 
    }
}
 
cs

 

+ Recent posts