문제
최근 아시아 지역의 학생들만 참여하는 정보 올림피아드 대회가 만들어졌다. 이 대회는 온라인으로 치러지기 때문에 각 나라에서 이 대회에 참여하는 학생 수의 제한은 없다.
참여한 학생들의 성적순서대로 세 명에게만 금, 은, 동메달을 수여한다. 단, 동점자는 없다고 가정한다. 그리고 나라별 메달 수는 최대 두 개다.
예를 들어, 대회 결과가 다음의 표와 같이 주어졌다고 하자.
참가국 / 학생번호 / 점수
1 / 1 / 230
1 / 2 / 210
1 / 3 / 205
2 / 1 / 100
2 / 2 / 150
3 / 1 / 175
3 / 2 / 190
3 / 3 / 180
3 / 4 / 195
이 경우, 금메달 수상자는 1번 국가의 1번 학생이고, 은메달 수상자는 1번 국가의 2번 학생이며, 동메달 수상자는 3번 국가의 4번 학생이다. (1번 국가의 3번 학생의 성적이 동메달 수여자보다 높지만, 나라 별 메달 수가 두 개 이하 이므로 1번 국가 3번 학생은 동메달을 받을 수 없다.)
대회 결과가 입력으로 주어질 때, 메달 수상자를 결정하여 출력하는 프로그램을 작성하시오.
입력
첫 번째 줄에는 대회참가 학생 수를 나타내는 N이 주어진다. 단, 3 ≤ N ≤ 100이다. 두 번째 줄부터 N개의 줄에는 각 줄마다 한 학생의 소속 국가 번호, 학생 번호, 그리고 성적이 하나의 빈칸을 사이에 두고 주어진다. 단, 국가 번호는 1부터 순서대로 하나의 정수로 주어지며, 각 학생번호는 각 나라별로 1부터 순서대로 하나의 정수로 주어진다, 점수는 0 이상 1000 이하의 정수이고, 동점자는 없다고 가정한다. 입력으로 제공되는 국가는 적어도 두 나라 이상이다.
출력
메달을 받는 학생들을 금, 은, 동메달 순서대로 한 줄에 한 명씩 출력한다. 즉, 첫 번째 줄에는 금메달 수상자를, 두 번째 줄에는 은메달 수상자를, 세 번째 줄에는 동메달 수상자를 출력한다. 하나의 줄에는 소속국가 번호와 학생 번호를 하나의 빈칸을 사이에 두고 출력한다.
풀이
풀이
- 국가, 참가 번호, 점수를 같이 저장할 2차원 배열과 같은 국가가 나온 횟수를 체크하기 위한 1차원 배열을 이용한다.
- 최고점을 찾고 해당 최고점을 0으로 바꿔준다.(다음 최고점을 찾기 위해)
- 같은 국가에서 2번 나오지 않았다면 출력하고 2번 나왔다면 pass하도록 작성한다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
#include <iostream>
using namespace std;
int n, c, num, s;
int arr[100][3]; // 국가, 번호, 점수
int check[100]; // 국가 나온 횟수 체크
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
// 입력 및 저장
for (int i = 0; i < n; i++) {
cin >> arr[i][0] >> arr[i][1] >> arr[i][2];
}
int count = 0; // 출력 횟수
while (count < 3) {
int max = 0; // 최고점
int index = 0; // 최고점의 index
for (int i = 0; i < n; i++) {
if (arr[i][2] > max) {
max = arr[i][2];
index = i;
}
}
// 찾은 최고점 0으로 세팅 -> 다음 최고점을 찾기위해
for (int i = 0; i < n; i++) {
if (arr[i][2] == max) {
arr[i][2] = 0;
}
}
// 같은 국가에서 2번이 나오지 않았다면 출력, 나왔다면 pass
if (check[arr[index][0]] < 2) {
count++;
check[arr[index][0]]++;
cout << arr[index][0] << ' ' << arr[index][1] << '\n';
}
}
}
|
cs |
메모
잘못된 코드가 맞았다고 채점이 되어서 질문으로 남겼다. 혹시나 문제가 고쳐지면 굉장히 기분이 좋을 것 같다. 질문도 남기고 다시 푸느라 시간이 조금 걸렸지만 뿌듯하고 기대되는 문제였다.