https://www.acmicpc.net/problem/1406
1406번: 에디터
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수
www.acmicpc.net
📌 작성한 코드
// 1406
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "Beakjoon/Silver/test.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const front = [...input[0]];
const back = [];
const len = Number(input[1]);
for (let i = 2; i < len + 2; i++) {
const [command, s] = input[i].split(" ");
if (command === "L") {
if (front.length > 0) back.push(front.pop());
} else if (command === "D") {
if (back.length > 0) front.push(back.pop());
} else if (command === "B") {
if (front.length > 0) front.pop();
} else {
front.push(s);
}
}
console.log([...front, ...back.reverse()].join(""));
📌 풀이
연결리스트를 사용해서 푼 문제이다. 자바스크립트는 연결리스트 자료구조를 제공하지 않기 때문에 직접 구현해서 사용해야 하는데, 이번 문제에서는 2개의 배열을 이용해서 (야매)연결리스트를 구현해서 풀어보았다. (바킹독님의 강의를 통해 알게되었다.)
front와 back에 현재 위치의 전, 후 요소들을 저장하는 방식이다.
L : 현재 위치에서 커서를 왼쪽으로 이동한다 -> 뒤에 있는 요소 한개를 앞의 배열로 보낸다.
D : 현재 위치에서 커서를 오른쪽으로 이동한다 -> 앞에 있는 요소 한개를 뒤의 배열로 보낸다.
B : 현재 위치의 앞 요소를 제거한다. -> 앞에 있는 요소를 삭제한다.
P : 요소를 추가한다 -> 요소를 추가하면 현재 자리에 추가되는 것이므로 앞의 배열에 추가하는 것과 같은 효과가 나타난다.
이렇게 작동시키면 front에는 앞의 원소가 순서대로, back에는 원소가 반대 순서로 저장된다. 마지막까지 연산 한 후에 이 front와 back을 출력해주면 최종 편집된 문자열을 얻을 수 있다.
📌 주의
시간을 타이트하게 주고 있어서 그런지 평소에 풀던대로 input.shift()를 통해서 입력을 가져오면 시간 초과가 발생하였다. 제공하는 입력의 길이가 생각보다 길어서 발생하는 것 같다. shift()말고 인덱스 접근을 통해 가져오면 문제가 발생하지 않으니까 주의해서 풀도록 하자.
✅ 성공

'알고리즘 > 백준' 카테고리의 다른 글
| [JavaScript] 백준 실버 4 : 10828 - 스택 (1) | 2024.01.21 |
|---|---|
| [JavaScript/Queue] 백준 실버 4 : 1158 - 요세푸스 문제 (0) | 2024.01.21 |
| [JavaScript] 백준 실버 2 : 5397 - 키로거 (1) | 2024.01.20 |
| [JavaScript] 백준 실버 3 : 3273 - 두 수의 합 (1) | 2024.01.20 |
| [JavaScript/BFS] 백준 골드 5 : 13549 - 숨바꼭질 3 (1) | 2024.01.18 |