코딩테스트

[백준] 피카츄 (JS)

여유로운 프론트엔드 개발자 2025. 2. 12. 22:05

문제

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

 

피카츄는 "pi", "ka", "chu"를 발음할 수 있다. 따라서, 피카츄는 이 세 음절을 합친 단어만 발음할 수 있다. 예를 들면, "pikapi"와 "pikachu"가 있다.

문자열 S가 주어졌을 때, 피카츄가 발음할 수 있는 문자열인지 아닌지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 문자열 S가 주어진다. 문자열은 알파벳 소문자로 이루어진 문자열이며, 길이는 5000을 넘지 않는다.

출력

문자열 S가 "pi", "ka", "chu"를 이어 붙여서 만들 수 있으면 "YES"를 아니면 "NO"를 출력한다.

풀이(1)

1. 입력받은 문자열을 str에 순차적으로 넣어준다.

2. 피카츄가 발음할 수 있는 문자열에 포함이 되면 str을 초기화한다.

3. str이 빈 문자열인지 아닌지 체크하여 답을 구한다.

const fs = require("fs");
const input = fs
  .readFileSync("./dev/stdin")
  .toString()
  .trim()

Solution = (input) => {
    const arr = ["pi", "ka", "chu"];
    let str = "";
    let isAnswer = true;

    for (let i = 0; i < input.length; i++) {
        str += input[i];
        if (arr.includes(str)) str = "";
    }
    if (str.length > 0) {
        isAnswer = false;
    }

    console.log(isAnswer ? "YES" : "NO");
}

Solution(input);

풀이(2)

1. replaceAll 메서드의 첫 번째 매개변수에 정규 표현식을 사용하여 pi, ka, chu 중 하나와 일치하는 부분을 찾아 빈 문자열로 대체한다.

2. 대체된 문자열의 길이를 이용하여 답을 구한다.

const fs = require("fs");
const input = fs
  .readFileSync("./dev/stdin")
  .toString()
  .trim()

Solution = (input) => {
    input = input.replaceAll(/pi|ka|chu/g, "");
    console.log(input.length === 0 ? "YES" : "NO");
}

Solution(input);

결론

처음에는 replaceAll 체이닝으로 접근하였다.

그러나 cpiachu일 때 반례가 나타났다. pi를 먼저 치환하면 cachu가 되므로 YES를 출력하였다..

replaceAll 메서드의 첫 번째 매개변수에 정규 표현식을 사용하여 해결하였다.

또 다른 방법으로는 반복문을 사용하여 발음할 수 있는 문자열이 됐을 경우 초기화하면서 남아있는 str의 길이를 이용하여 문제를 해결하였다.

'코딩테스트' 카테고리의 다른 글

[백준] 슈퍼 마리오 (JS)  (0) 2025.02.14
[백준] 서강근육맨 (JS)  (0) 2025.02.13
[백준] 2+1 세일 (JS)  (0) 2025.02.11
[백준] 30 (JS)  (0) 2025.02.10
[백준] 나는 친구가 적다 (Small) (JS)  (0) 2025.02.08