[백준5430_자바스크립트(javascript)] - AC

경이·2024년 8월 8일

𝑩𝑶𝑱 (𝒋𝒔)

목록 보기
113/325

🔴 문제

AC


🟡 Sol

const fs = require('fs');
const path = process.platform === 'linux' ? '/dev/stdin' : 'Wiki\\input.txt';
const inputs = fs.readFileSync(path).toString().trim().split('\n');
const T = Number(inputs[0]);

let f = 1;

for (let t = 0; t < T; t++) {
  const comments = inputs[f++];
  const n = Number(inputs[f++]);
  const arr = (inputs[f++].match(/\d+/g) ?? []).map(Number);
  let isReversed = false;
  let isTrigger = false;

  for (const c of comments) {
    if (c === 'R') {
      isReversed = !isReversed;
    } else if (arr.length && c === 'D' && isReversed) {
      arr.pop();
    } else if (arr.length && c === 'D' && !isReversed) {
      arr.shift();
    } else {
      isTrigger = true;
      break;
    }
  }

  if (isReversed) arr.reverse();

  console.log(
    isTrigger ? 'error' : arr.length ? '[' + arr.toString() + ']' : arr
  );
}

🟢 풀이

⏰ 소요한 시간 : 40분

테스트 케이스가 여러개이므로 문제에서 주어진 T 만큼 반복해주면 된다.
이렇게 테스트케이스가 여러개인 경우 shift() 연산을 통해 한줄씩 꺼내면 시간초과가 생길 수 있으므로 인덱스 번호f를 통해 접근한다.
각 테스트 케이스별 명령어 commentsn(사용되지는 않음) 숫자배열arr 를 입력받는다.
매번 reverse()를 호출하게 되면 당연히 시간초과가 발생하기 때문에 뒤집어진 상태인지 아닌지를 기억하는 상태변수 isReversed를 만둘어 준다. 그리고 에러 발생 여부를 관리하는 상태변수 isTrigger도 만들어 주었다.
이제 명령어들을 순회하며 명령어 cR일 경우에는 상태변수 isReversed!연산을 해주면 된다.
만약 명령이 D라면 현재 배열에 요소가 존재할 때만 수행할 수 있기 때문에 arr.length를 확인해준뒤, 뒤집어져 있는 상태면 뒤에서 꺼내는 pop() 연산 뒤집어져있지 않으면 앞에서 꺼내는 shift() 연산을 수행해주면 된다. 명령어는 RD뿐이므로 else로 빠지는 경우는 빈 배열에 D연산을 수행해줬을 경우밖에 없다. 그 경우에는 에러를 트리거 해주고 break를 사용해 해당 테스트케이스를 종료한다.

마지막으로 하나의 테스트 케이스를 끝내면 결과를 출력해줘야 하는데 isReversed 상태값에 따라 arr를 뒤집어 줘야 한다. 출력때는 두가지 조건을 따져 출력하면 정답

  1. 에러가 발생했다면 'error' 를 출력
  2. 에러가 발생하지 않았다면 배열을 출력하되 공백없이 출력 !!

나는 2번에서 막혔다... 단순히 arr를 출력하면 [1,(공백)2,(공백)] 이렇게 공백값이 들어가 오답처리된다. 따라서 배열의 길이를 확인해가며 출력형식에 맞게 출력해주면 된다.

개인적으로 출력형식 가지고 장난치는 문제를 안좋아해서... 별로였다. 로직 자체는 엄청 쉬운데 이때문에 정답률이 많이 낮아진듯.. 백준의 질문게시판에는 ★☆★☆★ [필독] AC FAQ ★☆★☆★ 이렇게 필독 공지를 띄워놓기도 했다


🔵 Ref

profile
록타르오가르

0개의 댓글