[baekjoon] #1406 에디터 (Node.js)

seongminn·2023년 1월 9일
0

Algorithm

목록 보기
25/26
post-thumbnail

📖 문제

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


☃️ 풀이

처음엔 명령 하나하나에 대해 문자열을 변형하는 식으로 일일이 처리했다. 그랬더니 시간초과가 발생했다.

그래서 초기 문자열을 문자 단위 배열left로 나누고, 빈 배열 right을 하나 만들어서 다음과 같이 처리해줬다.

1. 명령어가 'L'이고 left에 값이 있는 경우 → left 배열의 마지막 요소를 right에 넣는다.
2. 명령어가 'D'이고 right에 값이 있는 경우 → right 배열의 첫번째 요소를 left에 넣는다.
3. 명령어가 'B'인 경우 → left의 마지막 요소를 제거한다.
4. 명령어가 'P'인 경우 → left에 추가하려는 문자열을 삽입한다.

위 알고리즘에서 leftright가 순서대로 나란히 존재한다고 할 때, 커서는 두 배열 사이에 있다고 볼 수 있다.


💽 소스코드

const input = require('fs').readFileSync('input.txt').toString().split('\n');
const left = input.shift().trim().split('');
const right = [];
const m = input.shift();

for (let i = 0; i < m; i++) {
  const next = input[i].split(' ').map((letter) => letter.trim());
  let [cmd, item] = next.length === 2 ? next : [next.shift(), ''];

  if (cmd === 'L' && left.length > 0) right.push(left.pop());
  if (cmd === 'D' && right.length > 0) left.push(right.pop());
  if (cmd === 'B') left.pop();
  if (cmd === 'P') left.push(item);
}

console.log(left.join('') + right.reverse().join(''));
profile
돌멩이도 개발 할 수 있다

0개의 댓글