문제
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 |