※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts