※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 12971번 문제인 APC는 쉬운 난이도 순일까, 아닐까?이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/25955
25955번: APC는 쉬운 난이도 순일까, 아닐까?
선우는 APC 문제를 만들기 위해 고민하며 역대 APC들을 둘러보던 와중, 이 대회들의 문제가 난이도가 쉬운 순으로 배치되어 있는 경향을 발견했다! 문제 출제가 완료되고 올해도 이러한 기조를 지
www.acmicpc.net
주어진 순서대로의 문제들의 배열을 A, 난이도 순서대로 정렬된 문제들의 배열을 B라 하자. 이때 A와 B가 같다면 문제의 답은 OK가 될 것이고 그렇지 않다면 KO가 될 것임은 자명하다. 한편 문제의 조건에 따라 A와 B에서 차례가 서로 다른 문제가 정확히 한 쌍 존재하므로 답이 KO인 경우 A와 B를 살펴 문제를 해결할 수 있다.
문제의 배열을 정렬해 문제를 해결하자. 정렬에 사용할 비교 기준을 구현할 때 B, S, G, P, D의 순서는 자연스러운 비교가 어려우므로 이에 신경써 구현하자. 또한 수를 문자열의 상태로 두고 비교하면 이 문제에서 필요한 대소비교가 되지 않는다는 점에도 유의하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int N;
pair<int, int> A[1000], B[1000];
vector<int> ans;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for (int i = 0; i < N; i++) {
string s; cin >> s;
int X, Y;
if (s.front() == 'B') X = 1;
else if (s.front() == 'S') X = 2;
else if (s.front() == 'G') X = 3;
else if (s.front() == 'P') X = 4;
else X = 5;
Y = stoi(s.substr(1, s.length() - 1));
A[i] = B[i] = make_pair(X, -Y);
}
sort(B, B + N);
for (int i = 0; i < N; i++) {
if (A[i] != B[i]) ans.emplace_back(i);
}
if (ans.empty()) cout << "OK";
else {
cout << "KO\n";
int x = B[ans.front()].first;
if (x == 1) cout << 'B';
else if (x == 2) cout << 'S';
else if (x == 3) cout << 'G';
else if (x == 4) cout << 'P';
else cout << 'D';
cout << -B[ans.front()].second << ' ';
x = B[ans.back()].first;
if (x == 1) cout << 'B';
else if (x == 2) cout << 'S';
else if (x == 3) cout << 'G';
else if (x == 4) cout << 'P';
else cout << 'D';
cout << -B[ans.back()].second << ' ';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 11916 // C++] 볼질 (2) | 2024.04.12 |
---|---|
[BOJ 27108 // C++] Ordered Fractions (0) | 2024.04.11 |
[BOJ 12971 // C++] 숫자 놀이 (0) | 2024.04.09 |
[BOJ 13728 // C++] 행렬식과 GCD (0) | 2024.04.08 |
[BOJ 6646 // C++] Wooden Fence (1) | 2024.04.07 |