알고리즘 :: 큰돌 :: Chapter 4 - 비트마스킹 :: 백준 14405번 피카츄

Embedded June·2023년 8월 8일
0
post-thumbnail

문제

문제 링크

해설

  • 브론즈급 쉬운 문제지만, 재밌는 반례 때문에 개인적으로 골머리를 앓았던 문제였습니다 ㅎㅎㅎ.
  • "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");
}

소스코드 링크

결과

profile
임베디드 시스템 공학자를 지망하는 컴퓨터공학+전자공학 복수전공 학부생입니다. 타인의 피드백을 수용하고 숙고하고 대응하며 자극과 반응 사이의 간격을 늘리며 스스로 반응을 컨트롤 할 수 있는 주도적인 사람이 되는 것이 저의 20대의 목표입니다.

0개의 댓글