[BOJ] AC(javascript)

레몬커드요거트·2026년 1월 27일

코딩테스트준비

목록 보기
15/66

알아둬야 할 주요 함수

split과 parse

const P = "RDD".split("");
// ["R", "D", "D"]

const arr = JSON.parse(input[idx++]);
// 배열로 들어오는 것이 배열로 저장

JS문자열은 iterable

const P = input[idx++];

for (const cmd of P) {
  // cmd는 'R' or 'D'
}

배열 형태는 쉼표사이에 공백 존재

 console.log("[" + arr.join(",") + "]");

배열을 그냥 찍는 게 아니라 이 모양 그대로 나와야 함

[1,2,3]
  • 대괄호 [ ]
  • 쉼표 , 사이에 공백 X

slice

 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(",") + "]");
}

힌트

1. “진짜로 뒤집을 필요가 없다”

R의 의미를 잘 생각해보면…

배열을 뒤집는 게 아니라

“읽는 방향만 바뀐다” 라고 볼 수 있음

isReversed = false 같은 플래그 하나로 관리 가능


2. shift 대신 “앞/뒤 포인터”

D도 굳이 shift() 할 필요 없음.

  • 뒤집히지 않은 상태 → 앞에서 제거
  • 뒤집힌 상태 → 뒤에서 제거

left, right 인덱스만 움직여도 충분함

[1,2,3,4]
 ^     ^
 left  right
 0      3

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(",") + "]");
}
profile
비요뜨 최고~

0개의 댓글