🔗 문제 링크
https://www.acmicpc.net/problem/5430
✏️ 풀이
const [T, ...input] = require('fs')
.readFileSync('/dev/stdin')
.toString()
.trim()
.split('\n');
const output = [];
for (let i = 0; i < input.length; i += 3) {
const p = input[i];
const n = +input[i + 1];
const arr = JSON.parse(input[i + 2]);
let isReversed = false;
let isError = false;
let startIndex = 0;
let endIndex = n - 1;
for (const command of p) {
if (command === 'R') {
isReversed = !isReversed;
} else {
if (startIndex > endIndex) {
isError = true;
break;
}
if (isReversed) {
endIndex--;
} else {
startIndex++;
}
}
}
const outputArr = arr.slice(startIndex, endIndex + 1);
output.push(
isError
? 'error'
: JSON.stringify(isReversed ? outputArr.reverse() : outputArr)
);
}
console.log(output.join('\n'));
R 함수일 때는 배열을 뒤집고, D 함수일 때는 shift 연산을 해야 한다.그런데 자바스크립트 배열은 큐가 아니기 때문에 shift 연산은 O(n)의 연산을 필요로 한다. 연산량을 줄이기 위해 직접 큐를 구현할 수도 있지만 내가 선택한 방법은 배열에서 빠지고 남은 부분의 인덱스를 기록하는 방법이다.
먼저 startIndex = 0, endIndex = 배열의 마지막 인덱스로 초기화 한다. R 함수가 실행될 때마다 isReversed를 갱신하여 현재 배열이 뒤집어졌는지 여부를 기록한다. D 함수를 실행할 때마다 isReversed 여부에 따라서 startIndex를 증가 또는 endIndex를 감소시킨다. 이렇게 계속 반복을 하다가 만약 D 함수를 실행하기 전 시점에 startIndex > endIndex가 되면 배열이 비어있다는 뜻이므로 에러를 발생시킨다. 만약 에러가 발생하지 않고 정상적으로 모든 함수가 실행되었다면, startIndex와 endIndex, 그리고 isReversed를 활용하여 원본 배열을 변형하면 함수 수행 결과로 얻을 배열을 동일하게 출력할 수 있다.
'연습장 > 백준(BOJ) 문제풀이' 카테고리의 다른 글
[백준 2110 - Node.js] 공유기 설치 (0) | 2022.10.13 |
---|---|
[백준 1759 - Node.js] 암호 만들기 (0) | 2022.10.12 |
[백준 1629 - Node.js] 곱셈 (0) | 2022.10.11 |
[백준 14888 - Node.js] 연산자 끼워넣기 (0) | 2022.08.30 |
[백준 10819 - Node.js] 차이를 최대로 (1) | 2022.08.27 |