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

 

이번에 볼 문제는 백준 29812번 문제인 아니 이게 왜 안 돼이다.
문제는 아래 링크를 확인하자.

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

 

29812번: 아니 이게 왜 안 돼

과제를 하다가 잔뜩 화가 난 김한양은 분노 조절을 위해 메모장을 열어서 키보드를 내려치기 시작했다. 메모장에는 알파벳으로만 이루어진 알 수 없는 문자열이 생겼지만, 이상하게도 H, Y, U 세

www.acmicpc.net

 

이 문제는 두 작은 문제를 해결해야 한다. 하나는 'H', 'Y', 'U'가 아닌 모든 문자를 지우는 데에 필요한 에너지의 최솟값을 구하는 것이고 다른 하나는 만들 수 있는 "HYU"의 개수를 구하는 것이다. 두 번째 문제의 경우 'H', 'Y', 'U' 중 가장 적은 문자의 개수만큼은 "HYU"를 항상 만들 수 있지만 그보다 많은 개수는 항상 만들 수 없다는 점을 관찰해 쉽게 해결할 수 있다. 아래에서는 첫 번째 문제의 해결 방법을 살펴보자.

 

지워야 하는 두 문자 사이에 'H', 'Y', 'U'가 끼어있으면 해당 두 문자를 드래그로 같이 선택해 지울 수 없다는 점을 확인하자. 따라서 주어지는 문자열을 'H', 'Y', 'U'을 기준으로 잘라 얻을 수 있는 각 부분문자열을 지우는 에너지의 합을 구하는 것으로 문제의 답을 구할 수 있다.

 

모든 문자가 지워야 할 문자일 때 드래그를 두 번 이상 하고 지우는 것은 모든 문자를 한 번에 드래그하고 지우는 것보다 항상 많은 에너지가 든다는 점을 관찰하자. 따라서 최소 에너지를 구할 때 드래그는 많아야 한 번만 할 수 있다고 가정해도 문제의 답을 충분히 구할 수 있다. 드래그를 하는 경우와 하지 않는 경우의 에너지 사용량을 각각 구해 문제를 해결하자.

 

두 작은 문제 모두 답이 0인 경우 0이 아닌 문제에 주어진 문자열을 출력해야 하는 점을 유의하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
using namespace std;

int N, D, M;
string s;
int cnt[128], combo;
int ans;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> s >> D >> M;
	for (auto &l : s) {
		if (l == 'H') {
			cnt['H']++;
			ans += min(M + D, combo * D);
			combo = 0;
		}
		else if (l == 'Y') {
			cnt['Y']++;
			ans += min(M + D, combo * D);
			combo = 0;
		}
		else if (l == 'U') {
			cnt['U']++;
			ans += min(M + D, combo * D);
			combo = 0;
		}
		else combo++;
	}
	ans += min(M + D, combo * D);

	if (ans) cout << ans << '\n';
	else cout << "Nalmeok\n";
	ans = min(cnt['H'], min(cnt['Y'], cnt['U']));
	if (ans) cout << ans;
	else cout << "I love HanYang University";
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 16506 // C++] CPU  (0) 2024.03.03
[BOJ 26424 // C++] Coloring Game  (0) 2024.03.02
[BOJ 24504 // C++] blobcry  (1) 2024.02.29
[BOJ 9344 // C++] 도로  (1) 2024.02.28
[BOJ 30646 // C++] 최대 합 순서쌍의 개수  (1) 2024.02.27

+ Recent posts