문제
문제 링크
해설
- 브론즈급 쉬운 문제지만, 재밌는 반례 때문에 개인적으로 골머리를 앓았던 문제였습니다 ㅎㅎㅎ.
- "pi", "ka", "chu" 세 문자열을 주어진 문자열 속에서 찾아 (
find()
) 해당 문자열이 세 부분 문자열로만 이뤄져있는지 검증하면 됩니다.
- 이때,
find()
로 찾은 문자열을 .erase()
로 지우면 안됩니다.
find()
로 찾은 문자열을 지운 뒤 최종 문자열이 빈 문자열인 경우 `YES'를 출력하는 방법은 재밌는 반례 때문에 불가능합니다.
kpia
가 바로 그 재밌는 반례들 중 하나입니다.
erase(, , find(, , "pi"))
로 문자열 "pi"를 찾아 지울 경우 문자열이 "ka"가 됩니다.
- 그렇다면 다음 반복문에서 문자열 "ka"를 찾아 지우기 때문에 결과적으로 빈 문자열이 돼 "Yes"가 됩니다.
- 그러므로 이 문제에서는
.erase()
내장함수가 아니라 .replace()
내장함수를 사용해서 찾은 부분 문자열을 공백(white space)으로 바꿔야 합니다.
코드
#include <iostream>
#include <string>
using namespace std;
const string pikachu[3] = {"pi"s, "ka"s, "chu"s};
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr);
string S;
cin >> S;
for (const string& target : pikachu)
for (size_t pos = 0; (pos = S.find(target)) != string::npos;)
S.replace(pos, target.length(), target.length(), ' ');
cout << ((S == string(S.length(), ' ')) ? "YES\n" : "NO\n");
}
소스코드 링크
결과