SWEA/[D2]

[C언어] SWEA 1204 최빈수 구하기

ruming 2020. 8. 15. 22:36

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으로 잡았나봄