문제: AC
분류: 구현, 자료 구조, 문자열, 파싱, 덱
난이도: 골드5
함수 D를 수행할 때 현재까지 함수 R을 몇 번 수행했는지에 따라 앞의 수를 지울지 뒤의 수를 지울지 결정한다.
현재까지 함수 R을 짝수 번 수행했다면 뒤집고 뒤집어서 원래 순서대로 돌아오기 때문에 배열의 앞의 수를 지워야 한다. 이 경우 frontDelCnt를 증가시킨다.
반대로 홀수 번 수행했다면 순서가 뒤집혀 있기 때문에 원래 배열을 기준으로 뒤의 수를 지워야 한다. 이 경우 backDelCnt를 증가시킨다.
이후 frontDelCnt와 backDelCnt의 합, 즉 지워야하는 수의 총 개수가 기존 배열에 있는 수의 개수보다 많다면 빈 배열에서 함수 D를 수행하는 것이므로 “error”를 출력한다.
그렇지 않다면 배열의 앞의 수를 frontDelCnt개, 뒤의 수를 backDelCnt개 지운다. 만약 함수 R을 수행한 횟수가 홀수라면 배열을 뒤집어서 출력하고, 짝수라면 그대로 출력한다.
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "input.txt";
const [T, ...input] = fs.readFileSync(filePath).toString().trim().split("\n");
const solution = (input) => {
for (let i = 0; i < input.length; i += 3) {
const func = input[i];
const n = input[i + 1];
let numbers = input[i + 2].split(/,|\[|\]/).filter((v) => v !== "");
let rCnt = 0;
let frontDelCnt = 0;
let backDelCnt = 0;
for (let p = 0; p < func.length; p++) {
if (func[p] === "R") rCnt++;
else if (func[p] === "D") {
// 현재까지 R이 짝수번 나왔다면 앞의 수를,
// 홀수번 나왔다면 뒤의 수를 지워야 한다.
if (rCnt % 2 === 0) frontDelCnt++;
else backDelCnt++;
}
}
// 배열에 들어있는 정수의 개수보다 지워야 하는 개수가 많다면 에러가 발생한다.
if (numbers.length < frontDelCnt + backDelCnt) console.log("error");
else {
// 앞뒤로 지워야 하는 만큼 지운다.
numbers = numbers.slice(frontDelCnt, numbers.length - backDelCnt);
// R이 홀수개라면 순서를 뒤집는다.
if (rCnt % 2 === 1) numbers = numbers.reverse();
// []와 ,를 붙여서 출력한다.
numbers = numbers.join(",");
console.log("[" + numbers + "]");
}
}
};
solution(input);