[백준 BOJ] 2535번 아시아 정보올림피아드 (C++/cpp)

2022. 10. 18. 11:31PS (Program Solving)/BOJ (백준)

문제 설명

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

 

2535번: 아시아 정보올림피아드

첫 번째 줄에는 대회참가 학생 수를 나타내는 N이 주어진다. 단, 3 ≤ N ≤ 100이다. 두 번째 줄부터 N개의 줄에는 각 줄마다 한 학생의 소속 국가 번호, 학생 번호, 그리고 성적이 하나의 빈칸을 사

www.acmicpc.net

백준 BOJ 2535번 아시아 정보올림피아드 문제 사진1
백준 BOJ 2535번 아시아 정보올림피아드 문제 사진2

 

접근 방법 - 구조체를 응용한 정렬 심화 문제

백준의 2535번 문제는 구조체와 정렬을 함께 이용하여 해결해야 하는 문제이다.

해당 문제는, 주어진 국가와 점수에 대하여 메달을 수여받을 학생의 국가와 번호를 출력해야 하는 문제이다.

메달은 점수 순으로 부여해야 하는데 정보를 한 쌍씩 묶어 정렬을 해야 하기 때문에, 필자는 여기서 구조체를 응용하였다.

이 유형과 비슷한 문제에 대해 이전에 작성한 ps글이 있는데, 이 링크를 아래에 기재해놓았다.

이러한 유형의 문제가 어색하다면 아래의 문제 풀이도 함께 참고해보길 바란다.

https://smary-it.tistory.com/m/239

 

[백준 BOJ] 11650번 좌표 정렬하기 (C++/cpp)

문제 설명 https://www.acmicpc.net/problem/11650 11650번: 좌표 정렬하기 첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 1

smary-it.tistory.com

이때, 한 국가에 부여할 수 있는 총 메달의 수가 2개 이하로 제한된다는 조건이 있기 때문에, 이 점을 유의하며 코드를 짜야한다.

혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면, 아래의 설명과 코드를 참고해보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) Person 구조체를 만들어 국가(land), 번호(num), 점수(score)를 멤버로 둔다.

 

2) Person 타입의 배열(p)을 전역 변수로 선언해둔다.

 

3) 학생의 수(n)와 학생들의 정보(p)를 순차적으로 입력받는다.

 

4) sort() 함수를 이용하여 p의 정보에 대해 오름차순 정렬을 한다.

여기서, 아래 compare  함수를 선언하고 이를 사용하여 구조체 정렬을 수행하게끔 한다.

이 문제와 같은 경우에는, 단순히 score의 값만을 비교하여 정렬을 수행한다.

(bool형으로 반환하여 각 경우에 대해 위치 변경이 필요한지 아닌지를 결정하게끔 compare 함수를 설정하였다.)

 

5) 위의 연산이 모두 완료되었다면, 메달을 수여받을 학생을 출력하도록 한다. 반복문을 통해 아래 연산을 취한다.

- 금메달과 은메달을 받을 학생을 순차적으로 출력한다.

- 다만 한 나라에 2개 이하의 메달을 수여할 수 있기 때문에, 동메달을 받을 학생을 출력할 때엔 아래처럼 해야 한다.

만일 금메달과 은메달을 받을 학생의 나라가 다르다면, 이 또한 마찬가지로 출력을 수행하면 된다.

다만 둘이 같은 나라인 경우엔, 다른 나라의 학생에게 동메달을 주어야 한다. 따라서, 무한 반복문을 수행해 다른 나라의 학생이 출력되도록 한다.

 

6) 출력이 모두 완료되었다면, 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <algorithm>
#define endl '\n'
using namespace std;

//백준 2535번 코드
struct Person {
	int land;
	int num;
	int score;
};

bool compare(Person p1, Person p2) {
	return p1.score > p2.score;
}

Person p[101];
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);	cout.tie(NULL);

	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> p[i].land >> p[i].num >> p[i].score;
	}
	sort(p, p + n, compare);

	for (int i = 0; i < 3; i++) {
		if (i == 2 && p[i].land == p[0].land && p[i].land == p[1].land) {
			while (1) {
				i++;
				if (p[i].land != p[0].land) {
					break;
				}
			}
		}
		cout << p[i].land << " " << p[i].num << endl;
	}
}

 

제출 결과

백준 BOJ 2535번 아시아 정보올림피아드 문제 C++ 제출 결과

(2022.07.30 백준 2535번 문제 제출 결과)

반응형