※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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;
}
'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 |