※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 27563번 문제인 Moo Operations이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/27563
27563번: Moo Operations
Because Bessie is bored of playing with her usual text string where the only characters are 'C,' 'O,' and 'W,' Farmer John gave her $Q$ new strings ($1 \leq Q \leq 100$), where the only characters are 'M' and 'O.' Bessie's favorite word out of the characte
www.acmicpc.net
길이가 3 미만인 문자열은 어떻게 조작해도 세 글자의 문자열로 만들 수 없다. 길이가 3 이상인 문자열에 대해서 생각해보자.
먼저 주어진 문자열의 길이를 3으로 만들어야하므로 문자를 지우는 연산을 (문자열의 길이 - 3)회 해야함을 관찰하자. 또한 문자를 지우는 연산은 주어진 문자열의 맨 앞과 뒤에만 시행할 수 있으므로 남는 문자의 위치는 주어진 문자열의 연속한 세 문자 중 하나가 됨을 관찰하자. 따라서 문제의 답은 (문자열의 길이 - 3)과 (주어진 문자열의 길이 3의 부분문자열 중 하나를 "MOO"로 바꾸는 데에 필요한 연산 개수의 최솟값)의 합으로 구할 수 있다.
길이 3의 문자열의 가짓수는 8종류뿐이므로 각 종류에 대해 이를 "MOO"로 바꿀 수 있는지, 있다면 몇 회의 연산을 추가로 필요로 하는지를 미리 전처리하는 것은 어렵지 않다. 이를 이용해 문제를 해결해주자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int Q;
string s; int slen;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> Q;
while (Q--) {
cin >> s;
slen = s.length();
if (slen < 3) {
cout << -1 << '\n';
continue;
}
bool chk1 = 0, chk2 = 0, chk3 = 0;
for (int i = 3; i <= slen; i++) {
string tmp = s.substr(i - 3, 3);
if (tmp == "MOO") chk3 = 1;
else if (tmp == "MOM" || tmp == "OOO") chk2 = 1;
else if (tmp == "OOM") chk1 = 1;
}
if (chk3) cout << slen - 3 << '\n';
else if (chk2) cout << slen - 2 << '\n';
else if (chk1) cout << slen - 1 << '\n';
else cout << -1 << '\n';
}
}
'BOJ' 카테고리의 다른 글
[BOJ 10864 // C++] 친구 (0) | 2023.02.28 |
---|---|
[BOJ 27227 // C++] Дивизионы (0) | 2023.02.28 |
[BOJ 27590 // C++] Sun and Moon (0) | 2023.02.27 |
[BOJ 5612 // C++] 터널의 입구와 출구 (0) | 2023.02.27 |
[BOJ 5555 // C++] 반지 (0) | 2023.02.26 |