알고리즘/백준
[boj 9935] 폭발 문자열-js
jinux127
2022. 4. 6. 22:50
메모리 초과로 고민 좀 했다..
내가 생각한 풀이 방법은 이렇다.
1. 폭발 문자열이 있다면 해당 문자열까지 배열에 삽입
2. 폭발 문자열 길이만큼 없앤 후 나머지 문자열 삽입
3. 반복
const filePath = process.platform === "linux" ? "/dev/stdin" : "input.txt";
const input = require('fs').readFileSync(filePath).toString().trim().split(/\n/);
const str = input.shift();
const target_str = input.shift();
const CLEARTEXT = "FRULA";
const sol = (str, target_str) =>{
let arr = str.split('');
let stk1 = [];
while(str.indexOf(target_str) !== -1){
for(let i=0; i<str.indexOf(target_str); i++){
stk1.push(arr.shift());
}
for(let i=0; i<target_str.length; i++){
arr.shift();
}
stk1.push(...arr);
arr = stk1;
str = stk1.join('');
stk1 = [];
}
str === "" ? console.log(CLEARTEXT) : console.log(str);
}
sol(str, target_str);
뭔가 이게 맞아? 싶으면 다 안된다 ㅋㅋㅋ 메모리초과가 나타났다.
다음 풀이
const filePath = process.platform === "linux" ? "/dev/stdin" : "input.txt";
const input = require('fs').readFileSync(filePath).toString().trim().split(/\n/);
const str = input[0];
const target_str = input[1];
const CLEARTEXT = "FRULA";
const sol = (str, target_str) =>{
let arr = str.split('');
let stk1 = [];
for(let j=0; j<arr.length; j++){
stk1.push(arr[j]);
if(stk1.length>= target_str.length && stk1.join('').indexOf(target_str) !== -1){
for(let i=0; i<target_str.length;i++){
stk1.pop();
}
}
}
stk1.length ===0 ? console.log(CLEARTEXT) : console.log(stk1.join(''));
}
sol(str, target_str);
그렇다면 shift 연산을 할 때 실패를 했던 기억이 있어 shift를 없애고 push pop만 사용해보았다. 하지만 예상과 달리 메모리초과
생각해보니 shift는 메모리 초과보단 시간 초과의 경우였던 것 같다.
천천히 생각해본 결과 join과 indexOf부분 중 하나 일 것 같았다.
정답
const filePath = process.platform === "linux" ? "/dev/stdin" : "input.txt";
const input = require('fs').readFileSync(filePath).toString().trim().split(/\n/);
const str = input[0];
const target_str = input[1];
const CLEARTEXT = "FRULA";
const sol = (str, target_str) =>{
let arr = str.split('');
let stk1 = [];
for(let j=0; j<arr.length; j++){
stk1.push(arr[j]);
if(stk1.length>= target_str.length){
let isBomb = true;
for(let i=1; i<=target_str.length;i++){
if(stk1[stk1.length-i] !== target_str[target_str.length - i]){
isBomb = false;
}
}
if(isBomb){
for(let i=0;i<target_str.length;i++){
stk1.pop();
}
}
}
}
stk1.length ===0 ? console.log(CLEARTEXT) : console.log(stk1.join(''));
}
sol(str, target_str);
좋아좋아
풀이는 이렇다
1. 문자열을 순서대로 스택에 푸시
2. 스택의 길이가 폭발 문자열과 같거나 큰가 비교 후 끝에서부터 차례대로 비교한다. (indexOf를 사용하지 않는 것이 포인트)
3. 만약 같다면 폭발문자열 길이만큼 pop 시킨다.
4 반복