[C]백준_9339 : 마라토너

Alal11·2023년 3월 12일
0
post-thumbnail

출처

https://www.acmicpc.net/problem/9339


문제

상근이는 마라톤 학원을 운영하고 있다. 학원의 수강생은 총 K명으로, 다가오는 마라톤 대회에 참가하기 위해 연습을 하고 있다.

마라톤 대회가 끝나고, 기록이 6시간 이하인 경우는 마라톤 완주 인증서를 받게 된다. 상근이는 인증서를 받은 수강생 중에 가장 기록이 좋은 사람에게 특별상을 주려고 한다.

마라톤 대회의 결과가 주어졌을 때, 인증서를 받는 수강생의 수와 특별상을 받은 수강생을 구하는 프로그램을 작성하시오.


입력

첫째 줄에 테스트 케이스의 개수 T ≤ 10가 주어진다.

각 테스트 케이스의 첫째 줄에는 수강생의 수 K가 주어진다. (1 < K ≤ 100) 둘째 줄에는 수강생의 참가 번호가 공백으로 구분되어져서 주어진다. 참가 번호는 백만을 넘지 않는 양의 정수이며, 겹치지 않는다. 셋째 줄에는 대회의 참가자 수 N이 주어진다. (K < N ≤ 1 000) 다음 N개 줄에는 각 참가자의 마라톤 결과를 나타내는 세 정수가 주어진다. 첫 번째 정수는 참가 번호이고, 두 번째 정수와 세 번째 정수는 그 사람의 기록(시와 분)이다. 분은 59보다 작거나 같은 음이 아닌 정수이고, 시는 23보다 작거나 같은 음이 아닌 정수이다. 참가자가 대회를 중간에 포기한 경우에는 시와 분이 -1으로 주어진다.

항상 대회 인증서를 받은 수강생이 존재한다.


출력

각 테스트 케이스마다 가장 기록이 좋은 수강생의 번호와 인증서를 받은 수강생의 수를 출력한다.

가장 기록이 좋은 수강생이 여러명인 경우에는 입력으로 먼저 들어오는 것을 출력한다.


예제 입출력


알고리즘 분류

  • 구현

➡️문제 분석

문제에서 요구한 대로 단순 구현만 해주면 되는 문제이다.


➡️코드(⭕)

#include <stdio.h>

int main()
{
	int test_case, hour, min;
	int best_score, score;
	int pass_cnt, special = -1;
	int student_cnt;
	int participant_cnt;
	int student[101] = { 0 };
	int participant;

	scanf("%d", &test_case);			// 테스트 케이스의 수

	for (int i = 0; i < test_case; ++i)
	{
		pass_cnt = 0;		  // 통과한 학생 수
		best_score = 1440;    // 최대점수 인덱스

		scanf("%d", &student_cnt);	// 수강생 수

		for (int j = 0; j < student_cnt; ++j)
			scanf("%d ", &student[j]);	 // 수강생들의 참가번호 입력

		scanf("%d", &participant_cnt);	 // 대회 참가자 수

		for (int j = 0; j < participant_cnt; ++j)
		{
			scanf("%d %d %d", &participant, &hour, &min);		// 참가번호, 시, 분

			if (hour == -1 && min == -1)	// 포기했을 경우
				continue;

			score = hour * 60 + min;		// 점수(분)

			//6시간 내 완주 시에만 통과 처리
			if (score <= 360) { 
				for (int idx = 0; idx < student_cnt; ++idx)
				{
					// 대회 참가번호와 수강생의 참가번호가 같을 때
					if (participant == student[idx])
					{
						pass_cnt += 1;
						if (score < best_score)		// 점수가 작을수록 best점수가 됨
						{
							best_score = score;
							special = participant;
						}
						break;
					}
				}
			}
		}
		printf("%d %d\n", special, pass_cnt);
	}
	return 0;
}

➡️코드 분석

  1. 테스트 케이스의 수를 입력받고 그만큼 전체 반복해준다.

  2. 수강생의 수를 입력받고, 그 수만큼 수강생의 참가번호를 입력받아 student[] 배열에 넣어준다.

  3. 대회 참가자 수를 입력받고, 그 수만큼 반복하여 각 참가자의 참가번호, 시, 분을 입력받는데 만약, 시와 분이 -1이라면 대회를 중간에 포기한 경우이므로 아래 코드는 무시하고 다음 반복문을 돌려주게 한다.

  4. 각 참가자의 점수를 분 단위로 바꿔주고, 6시간 이내로 완주해야 인증서를 받을 수 있으므로 if문으로 조건을 설정해준다.

  5. idx는 0부터 수강생 수만큼 반복해주는데, 대회 참가번호와 수강생의 참가번호가 같아야 하므로 if문으로 조건 설정해준다.

  6. 여기까지 조건이 성립되는 경우는 paas_cnt로 인증서를 받은 수강생의 수를 세어준다.

  7. 마지막으로 가장 성적이 좋은 수강생의 참가번호를 구하기 위해 점수를 비교해준다. (점수(분)이 작을수록 성적이 좋음)
    그렇게 구한 기록이 좋은 수강생 번호와 인증서를 받은 수강생의 수를 출력해준다.


➡️end

처음에 문제 풀 때 학원 수강생과 대회 참가자가 같은 개념인 줄 알았다.. 위에서 참가번호 입력했는데 왜 또 입력하는거지?? 싶었던ㅋㅋㅋ 학원에서 주최하는 대회인줄 알았으나.. 다시 문제 파악을 해보니 학원 수강생이 아니더라도 대회를 참가하는 사람이 있는거구나 깨닫고 변수명도 싹 다 바꾸고 다시 풀었다.!
문제를 먼저 완전히 파악하는게 중요하다는 것 잊지말자ㅜ_ㅠ

0개의 댓글