https://www.acmicpc.net/problem/1406
처음엔 명령 하나하나에 대해 문자열을 변형하는 식으로 일일이 처리했다. 그랬더니 시간초과가 발생했다.
그래서 초기 문자열을 문자 단위 배열left
로 나누고, 빈 배열 right
을 하나 만들어서 다음과 같이 처리해줬다.
1. 명령어가 'L'이고 left에 값이 있는 경우 → left 배열의 마지막 요소를 right에 넣는다.
2. 명령어가 'D'이고 right에 값이 있는 경우 → right 배열의 첫번째 요소를 left에 넣는다.
3. 명령어가 'B'인 경우 → left의 마지막 요소를 제거한다.
4. 명령어가 'P'인 경우 → left에 추가하려는 문자열을 삽입한다.
위 알고리즘에서 left
와 right
가 순서대로 나란히 존재한다고 할 때, 커서는 두 배열 사이에 있다고 볼 수 있다.
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(''));