1000명의 수학 성적 중 최빈수를 찾는다.
최빈수 : 특정 자료에서 가장 여러 번 나타나는 값
제한 : 학생의 수는 1000명, 각 학생의 점수는 0점 이상 100점 이하의 값이다.
#include<stdio.h>
int main()
{
int T=0, T_num=0, entry=0, source, max;
int score[101] = {0};
scanf("%d", &T);
for (int tc = 1; tc <= T; tc++)
{
scanf("%d", &T_num);
for (int student = 0; student < 1000; student++)
{
scanf("%d", &entry);
score[entry]++;
}
source = 0;
max = 0;
for (int i = 0; i < 101; i++) {
if (source <= score[i]) {
source = score[i];
max = i;
}
score[i] = 0;
}
printf("#%d %d\n", tc, max);
}
return 0;
}
배열의 크기가 1000이면 for문을 돌릴 때마다 시간이 오래 걸리니 위의 코드보다는 더 효율적이라고 할 수 있다. 배열에 들어가는 값이 0~100의 범위기 때문에 가능하지만, 숫자의 범위가 더 크다면 그냥 1000짜리 for문을 돌리는 게 나을 것이다.
점수의 개수를 저장할 101크기의 정수형 배열을 하나 선언하고, 입력을 받는대로 score의 인덱스와 점수가 일치하는 곳의 숫자를 증가시킨다. 이렇게 하면 score에 들어있는 숫자가 바로 점수의 개수가 된다. 이제 for문으로 score 중 가장 큰 값을 찾으면 그 수가 최빈수다.
더보기
전에 풀었던 코드
//SWEA1204 최빈수 구하기
#include <stdio.h>
#include <stdlib.h>
int main(void){
int test[10] = {0};
int testCase, i, j, math, score;
int *answer;
scanf("%d", &testCase);
answer = (int*)malloc(sizeof(int)*testCase);
for(i=0; i<testCase; i++){
scanf("%d", &test[i]);
int num[1000] = {0};
for(j=0; j<1000; j++){
scanf("%d", &math);
num[math-1]++;
}
score = 0;
for(j=0; j<1000; j++){
if(num[j]>=score){
score = num[j];
answer[i] = j+1;
}
}
}
for(i=0; i<testCase; i++){
printf("#%d %d\n", test[i], answer[i]);
}
return 0;
}
헷갈려서 배열 크기를 1000으로 잡았나봄
'SWEA > [D2]' 카테고리의 다른 글
[C언어] SWEA 1966 숫자를 정렬하자 (0) | 2020.08.20 |
---|---|
[C언어] SWEA 1961 숫자 배열 회전 (0) | 2020.08.16 |
[C언어] SWEA 1284 수도요금경쟁 (0) | 2020.08.15 |
[C언어] SWEA 1970 쉬운 거스름돈 (0) | 2020.08.09 |
[C언어] SWEA 1989 초심자의 회문검사 (0) | 2020.08.09 |