SW Expert Academy 의 1204번 문제입니다. [S/W 문제해결 기본] 강좌를 수강하시는 분들이라면 가장 처음 만날 수 있는 문제입니다.
- 난이도 : 1
Input
첫 줄에는 테스트 케이스 T가 주어지고, 그 다음줄에는 각 테스트 케이스의 번호가 주어지며, 그 다음줄부터는 1000개의 학생 점수 데이터(0점부터 100점까지의 범위)가 주어집니다.
각 테스트 케이스 별로, 점수 데이터 1천개 중에 가장 많은 빈도의 점수(최빈수)를 구하면 됩니다.
단, 최빈수가 여러 개일 경우 그 중 가장 큰 점수를 출력합니다.
Output
테스트 케이스 번호별로 최빈수를 출력합니다. 출력 형식은 #1 71 \n #2 76 \n … 의 형식입니다.
테스트 케이스는 10개로 주어져 있습니다.
생각한 아이디어
단순하게 가장 많이 나온 숫자를 찾는 문제이기 때문에, 인덱스 0부터 100까지 존재하는 int 배열을 선언한 뒤 각 점수에 해당하는 배열 값을 1씩 증가시키면서 빈도수를 체크했습니다.
(예) 76 을 읽었을 경우, arr[76]의 값을 1 증가시킨다.
이런 식으로 배열에는 각 점수별 빈도수가 체크될 것이며, 가장 큰 빈도수를 가진 인덱스 넘버를 찾아서 출력하면 될 것입니다.
예를 들어 arr[70]의 값이 가장 크다면, 70이 제일 많이 나온 숫자라는 의미이며, 70을 출력합니다.
그러나 만일 가장 많이 나온 최빈수가 72, 87, 96 등과 같이 여러 개라면 그 중에서 가장 큰 96을 출력합니다.
[소스코드]
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
43
44
45
46
47
48
#include<iostream>
using namespace std;
int main(int argc, char** argv)
{
int test_case;
int T;
int test_num;
int temp_score;
int max=0, freq=0;
cin>>T; //T는 10
for(test_case = 1; test_case <= T; ++test_case)
{
// 입력받기 ////////
cin >> test_num;
int * score = new int[101];
for(int i = 0; i<=100; i++){
score[i]=0;
}
for(int i = 0; i<1000; i++){
cin >> temp_score;
score[temp_score]++;
}
for(int i=0;i<101;i++){
if (max < score[i]){
max = score[i];
freq = i;
}
else if(max == score[i]){
if(freq < i)
freq = i;
}
}
cout << "#" << test_num << " " << freq << endl;
delete[] score;
score = NULL;
max = 0;
freq = 0;
}
return 0;
}