jinux127
Jinux
jinux127
  • 분류 전체보기 (109)
    • 엘리스 SW 엔지니어 트랙 (6)
      • TIL (6)
    • 개발지식 (22)
      • React (4)
      • JavaScript (9)
      • Web (4)
      • Node.js (1)
      • TypeScript (4)
    • 알고리즘 (69)
      • 백준 (47)
      • 프로그래머스 (14)
      • 이것이 코딩테스트다 (6)
    • 프로젝트 (10)
      • PHOTOCALENDAR (3)
      • 빙수먹을래? (7)
    • Life (0)
      • 헬스 (0)
      • 독서 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 블로그 이전

인기 글

태그

  • node.js
  • 문법
  • 그리디
  • 구현
  • 알고리즘
  • CSS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jinux127

Jinux

알고리즘/백준

[boj 9935] 폭발 문자열-js

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 반복

 

'알고리즘 > 백준' 카테고리의 다른 글

[boj 1475] 방 번호 - js  (0) 2022.04.22
[boj 2455] 지능형 기차  (0) 2022.03.28
[boj 14889] 스타트와 링크  (0) 2022.03.25
[boj 14888] 연산자 끼워넣기 -js  (0) 2022.03.24
[boj 2675] 문자열 반복 - js  (0) 2022.03.19
jinux127
jinux127

티스토리툴바