※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 27535번 문제인 제주 초콜릿 지키기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/27535
27535번: 제주 초콜릿 지키기
첫 번째 줄에 현재 종류별로 남아있는 초콜릿의 개수 $H$, $T$, $C$, $K$, $G$가 주어진다. $H$, $T$, $C$, $K$, $G$는 각각 한라봉, 감귤, 백년초, 키위, 녹차 초콜릿의 남아있는 개수이다. 두 번째 줄에 초콜
www.acmicpc.net
매 단계마다 (1)초콜릿의 개수의 합의 일의 자리를 확인해 3에서 출력할 진법을 구하고 (2) 주어지는 각 개수대로 초콜릿을 제거하고 (3) 전체 초콜릿의 개수를 1에서 구한 진법으로 형식에 맞게("7H"를 뒤에 이어) 한 줄에 출력하고 (4) 남아있는 개수 내림차순, 같은 개수이면 알파벳순 오름차순으로 "남아있는" 초콜릿들을 대응되는 문자로 한 줄에 출력(출력할 게 없다면 "NULL" 출력)하는 과정을 반복해 문제를 해결하자.
(4)의 정렬과정은 남아있는 개수에 음의 부호를 붙여 저장하면 두 정렬기준이 모두 오름차순이 되므로 이 성질과 pair과 sort를 이용하면 쉽게 구현할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N;
int H, T, C, K, G;
int bs;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> H >> T >> C >> K >> G;
cin >> N;
while (N--) {
bs = (H + T + C + K + G) % 10;
if (bs < 2) bs = 10;
int x;
cin >> x; H -= x;
cin >> x; T -= x;
cin >> x; C -= x;
cin >> x; K -= x;
cin >> x; G -= x;
int cnt = H + T + C + K + G;
if (cnt) {
vector<int> ans;
while (cnt) {
ans.emplace_back(cnt % bs);
cnt /= bs;
}
while (!ans.empty()) {
cout << ans.back();
ans.pop_back();
}
cout << "7H\n";
vector<pair<int, char>> vec;
vec.emplace_back(make_pair(-H, 'H'));
vec.emplace_back(make_pair(-T, 'T'));
vec.emplace_back(make_pair(-C, 'C'));
vec.emplace_back(make_pair(-K, 'K'));
vec.emplace_back(make_pair(-G, 'G'));
sort(vec.begin(), vec.end());
for (auto& p : vec) {
if (p.first) cout << p.second;
}
cout << '\n';
}
else cout << "07H\n" << "NULL\n";
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 24767 // C++] Beehives (0) | 2023.02.25 |
---|---|
[BOJ 4542 // C++] Blue Jeans (0) | 2023.02.25 |
[BOJ 27497 // C++] 알파벳 블록 (0) | 2023.02.25 |
[BOJ 27160 // C++] 할리갈리 (0) | 2023.02.25 |
[BOJ 27542 // C++] 絶対階差数列 (Sequence of Absolute Differences) (0) | 2023.02.25 |