[C]백준_8979 : 올림픽

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

출처

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


문제

올림픽은 참가에 의의가 있기에 공식적으로는 국가간 순위를 정하지 않는다. 그러나, 많은 사람들이 자신의 국가가 얼마나 잘 하는지에 관심이 많기 때문에 비공식적으로는 국가간 순위를 정하고 있다. 두 나라가 각각 얻은 금, 은, 동메달 수가 주어지면, 보통 다음 규칙을 따라 어느 나라가 더 잘했는지 결정한다.

  1. 금메달 수가 더 많은 나라
  2. 금메달 수가 같으면, 은메달 수가 더 많은 나라
  3. 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라

각 국가는 1부터 N 사이의 정수로 표현된다. 한 국가의 등수는 (자신보다 더 잘한 나라 수) + 1로 정의된다. 만약 두 나라가 금, 은, 동메달 수가 모두 같다면 두 나라의 등수는 같다. 예를 들어, 1번 국가가 금메달 1개, 은메달 1개를 얻었고, 2번 국가와 3번 국가가 모두 은메달 1개를 얻었으며, 4번 국가는 메달을 얻지 못하였다면, 1번 국가가 1등, 2번 국가와 3번 국가가 공동 2등, 4번 국가가 4등이 된다. 이 경우 3등은 없다.

각 국가의 금, 은, 동메달 정보를 입력받아서, 어느 국가가 몇 등을 했는지 알려주는 프로그램을 작성하시오.


입력

입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각 국가를 나타내는 정수와 이 국가가 얻은 금, 은, 동메달의 수가 빈칸을 사이에 두고 주어진다. 전체 메달 수의 총합은 1,000,000 이하이다.


출력

출력은 단 한 줄이며, 입력받은 국가 K의 등수를 하나의 정수로 출력한다. 등수는 반드시 문제에서 정의된 방식을 따라야 한다.


서브태스크


예제 입출력


알고리즘 분류

  • 구현
  • 정렬

➡️문제 분석

각 국가마다 번호, 금, 은, 동 메달의 변수는 고정이므로 구조체를 이용하여 접근해본다.


➡️코드(⭕)

#include <stdio.h>
#include <stdlib.h>

struct Medal			// 각 국가의 번호와 메달 수를 담을 Medal 구조체 생성
{
	int country;
	int gold;
	int silver;
	int bronze;
};

int main()
{
	int N, K;			// N은 국가의 수, K는 등수를 알고 싶은 국가(= 타겟 국가)
	int i;
	int target = 0, rank = 0;	// target은 타겟 국가의 인덱스, rank는 타겟 국가의 등수

	scanf("%d %d", &N, &K);

	struct Medal* medals = malloc(N * sizeof(struct Medal));		// 동적 메모리 할당
	
	for (i = 0; i < N; i++)
	{
		scanf("%d %d %d %d", &medals[i].country, &medals[i].gold, &medals[i].silver, &medals[i].bronze);

		if (medals[i].country == K)
			target = i;
	}

	// 금-은-동메달 순서로 타겟 국가보다 성적이 좋은 나라를 세어줌
	for (i = 0; i < N; i++)
	{
		if (i != target)
		{
			if (medals[i].gold > medals[target].gold)
				rank++;
			else if (medals[i].gold == medals[target].gold)
			{
				if (medals[i].silver > medals[target].silver)
					rank++;
				else if (medals[i].silver == medals[target].silver)
				{
					if (medals[i].bronze > medals[target].bronze)
						rank++;
				}
			}
		}
	}
	printf("%d\n", rank + 1);
	
	free(medals);		// 할당된 동적 메모리 공간 반납
	return 0;
}

➡️코드 분석

  1. 각 국가의 번호와 메달 수를 담을 Medal 구조체를 선언한다.

  2. 국가의 수 N과 등수를 알고 싶은 국가 K를 입력받고, (N 크기 * 구조체 크기)만큼의 동적 메모리를 할당한다.

  3. N번 만큼 반복하여 국가 번호, 금, 은, 동 메달의 수를 입력 받고, 만약 타겟 국가와 입력받은 국가의 번호가 같으면 인덱스로 쓰일 target에 i 값을 넣어준다.

  4. i는 0부터 N-1까지 반복하는데, 만약 i와 타겟 국가의 인덱스 target이 같으면 그때의 등수(rank+1)를 출력한다.

  5. 같지 않다면 금, 은, 동메달 수를 if문으로 비교해보고 타겟 국가보다 성적이 높은 나라를 카운트 해주는 식으로 타겟 국가의 등수를 구할 수 있다.


➡️end

구조체!! 간단하면서도 익숙하지가 않아서 아직 조금 어렵게 느껴진다ㅜ_ㅜ 풀 때는 어려웠는데 완성된 코드를 보면 바로 이해되는 문제ㅋㅋㅋ 지금은 이정도 난이도가 딱 적당한 것 같다😂

0개의 댓글