
입력으로 문자열을 받고 특정 문자열에 따라 명령을 실행하는 문제이다.
< 가 들어오면 커서를 왼쪽으로 이동> 가 들어오면 커서를 오른쪽으로 이동- 가 들어오면 커서 왼쪽 값 제거 예시
<<BP<A>>Cd-
|
^ 커서 위치
B P |
^
B | P
^
B A | P
^
B A P |
^
B A P C d |
^
B A P C |
^
결과 : BAPC
백준 1406 에디터 문제와 매우 유사한 문제이다.
에디터 문제를 풀 때는 연결 리스트를 이용하여 풀었기 때문에 이번에는 2개의 스택을 이용하여 푸는 방식으로 풀어보겠다.
해당 풀이의 핵심은 커서의 위치를 left와 right 두개의 스택 사이에 위치한다고 생각하는 것이다.
그럼 각각의 기능은 다음과 같다
| 명령 | 설명 |
|---|---|
| < | 왼쪽에서 pop 후 오른쪽으로 push |
| > | 오른쪽에서 pop 후 왼쪽으로 push |
| - | 왼쪽에서 pop |
전체 풀이
let fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
let Test = parseInt(input.shift());
const TwoStack = (OrderString) => {
const OrderArr = OrderString.split('');
let left = [];
let right = [];
for (const Order of OrderArr) {
if (Order === '<') {
if (!left.length) continue;
right.push(left.pop());
}else if (Order === '>') {
if (!right.length) continue;
left.push(right.pop());
}else if (Order === '-') {
left.pop();
}else {
left.push(Order);
}
}
return left.concat(right.reverse()).join('');
};
const solution = (N, INPUT) => {
let answer = '';
for (let i = 0; i < N; i++) {
answer += `${TwoStack(INPUT[i])}\n`;
}
return answer;
};
console.log(solution(Test, input));
백준 에디터 문제를 처음 풀고 나서 2개의 스택을 이용하여 푸는 풀이를 봤을 때 어떻게 이런 생각을 하지 하면서 스스로 더 노력해야겠다는 생각을 하게 했던 풀이였는데 그 풀이를 이용하여 풀 수 있는 문제가 나와서 매우 반가우면서도 이번에는 내가 그런 풀이로 풀 수 있다는 것에 기뻤던 문제였다.