2022. 10. 18. 11:31ㆍPS (Program Solving)/BOJ (백준)
문제 설명
https://www.acmicpc.net/problem/2535
접근 방법 - 구조체를 응용한 정렬 심화 문제
백준의 2535번 문제는 구조체와 정렬을 함께 이용하여 해결해야 하는 문제이다.
해당 문제는, 주어진 국가와 점수에 대하여 메달을 수여받을 학생의 국가와 번호를 출력해야 하는 문제이다.
메달은 점수 순으로 부여해야 하는데 정보를 한 쌍씩 묶어 정렬을 해야 하기 때문에, 필자는 여기서 구조체를 응용하였다.
이 유형과 비슷한 문제에 대해 이전에 작성한 ps글이 있는데, 이 링크를 아래에 기재해놓았다.
이러한 유형의 문제가 어색하다면 아래의 문제 풀이도 함께 참고해보길 바란다.
https://smary-it.tistory.com/m/239
이때, 한 국가에 부여할 수 있는 총 메달의 수가 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;
}
}
제출 결과
(2022.07.30 백준 2535번 문제 제출 결과)
'PS (Program Solving) > BOJ (백준)' 카테고리의 다른 글
[백준 BOJ] 3003번 킹, 퀸, 룩, 비숍, 나이트, 폰 (C++/cpp) (0) | 2022.10.20 |
---|---|
[백준 BOJ] 2748번 피보나치 수 2 (C++/cpp) (0) | 2022.10.18 |
[백준 BOJ] 11945번 뜨거운 붕어빵 (C++/cpp) (0) | 2022.10.14 |
[백준 BOJ] 2446번 별 찍기 - 9 (C++/cpp) (0) | 2022.10.13 |
[백준 BOJ] 7600번 문자가 몇갤까 (C++/cpp) (0) | 2022.10.13 |