어떤 문자열이 주어지면 폭발 문자열을 감지하여 삭제하고, 모두 삭제한 후 남은 문자 (없으면 FRULA)를 출력하는 문제이다.
단순 replace로 접근하기
let [wa, pas] = require('fs').readFileSync(0, 'utf8').trim().split('\n');
while (wa.includes(pas)) {
wa = wa.replace(pas, '') || 'FRULA';
}
console.log(wa);
처음에 시도한 코드는 이렇다. 정규식으로는 안 되는 문제고, 무식하게 해당 문자가 모두 제거될 때까지 String.prototype.replace()
를 호출한다.
물론 이걸로 됐다면 문제 티어가 골드 4일 리가 없는 관계로 방법은 맞으나 시간 초과가 떴다.
스택 이용하기
머리로 생각해본 작동 로직은 이렇다.
- 일단 문자열을 받아서 배열 (스택)을 만들고 문자를 하나하나 추가한다.
- 동시에 폭발 문자열의 길이만큼 뒤에서 잘라서 일치하는지 확인한다.
- 일치한다면 그 길이만큼 다시 반복문을 돌려 스택을
pop()
처리한다.
let [wa, pas] = require('fs').readFileSync(0, 'utf8').trim().split('\n');
const wapas = [];
const len = pas.length;
for (let i = 0; i < wa.length; i++) {
wapas.push(wa[i]);
if (wapas.slice(-len).join('') === pas) {
for (let j = 0; j < len; j++) {
wapas.pop();
}
}
}
console.log(wapas.join('') || 'FRULA');
이후 스택에 있는 문자들을 하나하나 합쳐서 출력해주면 된다. Array.prototype.join()
메소드는 결과물이 없는 경우 빈 문자를 반환하고, 이는 falsy value이기 때문에 OR 연산자를 사용하여 빈 문자면 문제 조건에 맞게 FRULA를 대신 출력한다.
