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

 

이번에 볼 문제는 백준 24980번 문제인 Photoshoot이다.
문제는 아래 링크를 확인하자.

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

 

24980번: Photoshoot

Farmer John, desperate to win the award for best cow photographer at the county fair, is trying to take the perfect photograph of his $N$ cows ($2 \leq N \leq 2\cdot 10^5$, $N$ even). Farmer John owns cows of two potential breeds: Guernseys and Holsteins.

www.acmicpc.net

맨 앞에서부터 짝수마리의 소들을 뒤집는 연산만이 가능하므로, 맨 앞부터 두 마리씩 끊어서 서로 붙어있는 소들은 떨어질 수가 없다는 점을 관찰하자.

 

이 두마리 조합이 "GG" 또는 "HH"라면 아무리 뒤집어도 다른 조합으로 바뀔 수가 없으므로 신경을 쓸 필요가 없다.

 

이 두마리 조합이 GH 또는 HG라면 이 조합들을 모두 "HG"로 배열해야 짝수위치에 G가 가장 많아진다.

 

따라서, 문자열을 처음서부터 읽어나가면서 "GG"와 "HH"는 무시하고, 인접한 두 조합이 서로 다르다면 뒤집어서 연속한 "HG" 또는 "GH"의 개수를 늘리고, 맨 마지막에 이 조합들이 "HG"가 아니라면 한번 더 뒤집어 모두를 "HG"로 바꿔주자. 

 

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

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

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

	int N; cin >> N;
	string s; cin >> s;

	int ans = 0;
	bool chk = 0;
	char cur;
	for (int i = 0; i < N; i += 2) {
		if (s[i] != s[i + 1]) {
			if (chk) {
				if (s[i] != cur) cur = s[i], ans++;
			}
			else {
				cur = s[i];
				chk = 1;
			}
		}
	}

	if (cur == 'G') ans++;
	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 24978 // C++] Subset Equality  (0) 2022.04.29
[BOJ 24979 // C++] COW Operations  (0) 2022.04.28
[BOJ 24981 // C++] Counting Liars  (0) 2022.04.26
[BOJ 24982 // C++] Alchemy  (0) 2022.04.25
[BOJ 14919 // C++] 분포표 만들기  (0) 2022.04.24

+ Recent posts