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
구조체!! 간단하면서도 익숙하지가 않아서 아직 조금 어렵게 느껴진다ㅜ_ㅜ 풀 때는 어려웠는데 완성된 코드를 보면 바로 이해되는 문제ㅋㅋㅋ 지금은 이정도 난이도가 딱 적당한 것 같다😂
'코딩테스트 & 문제 풀이' 카테고리의 다른 글
[Java]백준_14215 : 세 막대 (1) | 2025.03.25 |
---|---|
[C]백준_5622 : 다이얼 (0) | 2024.04.08 |
[C]백준_24389 : 2의 보수 (0) | 2024.04.07 |
[C]백준_3447 : 버그왕 (0) | 2024.02.03 |
[C]백준_5597 : 과제 안 내신 분..? (2) | 2024.02.02 |