코딩테스트 & 문제 풀이

[C]백준_8979 : 올림픽

Hicecream 2024. 4. 7. 16:48

2023년 3월 6일에 작성됨

 

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

 

8979번: 올림픽

입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각

www.acmicpc.net

 

 

문제 분석

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

 

 

소스 코드 (⭕)

#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

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