
const P = "RDD".split("");
// ["R", "D", "D"]
const arr = JSON.parse(input[idx++]);
// 배열로 들어오는 것이 배열로 저장
const P = input[idx++];
for (const cmd of P) {
// cmd는 'R' or 'D'
}
console.log("[" + arr.join(",") + "]");
배열을 그냥 찍는 게 아니라 이 모양 그대로 나와야 함
[1,2,3]
[ ], 사이에 공백 X arr = arr.slice(left, right + 1);
slice는 reverse나 pop과 다르게 return이 없어서 따로 대입해줘야한다.
// AC
const fs = require("fs");
const input = fs.readFileSync(0, "utf-8").trim().split(/\s+/);
let idx = 0;
const T = Number(input[idx++]); // 테스트 케이스 갯수
for (let t = 0; t < T; t++) {
const P = input[idx++]; // 수행할 함수
const n = Number(input[idx++]); // 배열의 수의 갯수
let arr = [];
arr = JSON.parse(input[idx++]);
AC(P, arr);
}
function AC(P, arr) {
for (const cmd of P) {
if (cmd === "R") {
arr.reverse();
} else if (cmd === "D") {
if (arr.length === 0) {
console.log("error");
return;
} else {
arr.shift();
}
}
}
console.log("[" + arr.join(",") + "]");
}
R의 의미를 잘 생각해보면…
배열을 뒤집는 게 아니라
“읽는 방향만 바뀐다” 라고 볼 수 있음
isReversed = false 같은 플래그 하나로 관리 가능
D도 굳이 shift() 할 필요 없음.
left, right 인덱스만 움직여도 충분함
[1,2,3,4]
^ ^
left right
0 3
모든 명령 처리 끝난 뒤
left ~ right 범위만 출력
isReversed === true면 그때만 역순 출력
핵심: 연산 중엔 배열을 건드리지 않는다
// AC
"use strict";
const fs = require("fs");
const input = fs.readFileSync(0, "utf-8").trim().split(/\s+/);
let idx = 0;
const T = Number(input[idx++]); // 테스트 케이스 갯수
for (let t = 0; t < T; t++) {
const P = input[idx++]; // 수행할 함수
const n = Number(input[idx++]); // 배열의 수의 갯수
let arr = [];
arr = JSON.parse(input[idx++]);
AC(n, P, arr);
}
function AC(n, P, arr) {
let isReverse = false;
let left = 0;
let right = n - 1;
for (const cmd of P) {
if (cmd === "R") {
isReverse = !isReverse;
} else if (cmd === "D") {
if (arr.length === 0 || left > right) {
console.log("error");
return;
} else if (isReverse === false) {
left++;
} else if (isReverse === true) {
right--;
}
}
}
if (left === right) {
arr = arr.slice(left);
} else {
arr = arr.slice(left, right + 1);
if (isReverse) {
arr.reverse();
}
}
console.log("[" + arr.join(",") + "]");
}