티스토리 뷰

const fs = require("fs");
const rawInput = fs.readFileSync('dev/stdin').toString().split(/\n/g);
const N = +rawInput.shift();
const A = rawInput.shift().split(/ /g).map(Number);
const op = rawInput.shift().split(/ /g).map(Number);

let min = Infinity;
let max = -Infinity;

const recurse = (n, now, ops) => {
  // 종료부
  if (N === n) {
    // 최소보다 작으면 최소를 변경
    if (min > now) {
      min = now;
    }

    // 최대보다 크면 최대를 변경
    if (max < now) {
      max = now;
    }

    return;
  }

  //실행부

  if (ops[0] > 0) {
    const newOp = ops.slice();
    newOp[0] -= 1;
    recurse(n + 1, now + A[n], newOp);
  }
  if (ops[1] > 0) {
    const newOp = ops.slice();
    newOp[1] -= 1;
    recurse(n + 1, now - A[n], newOp);
  }
  if (ops[2] > 0) {
    const newOp = ops.slice();
    newOp[2] -= 1;
    recurse(n + 1, now * A[n], newOp);
  }
  if (ops[3] > 0) {
    const newOp = ops.slice();
    newOp[3] -= 1;
    recurse(n + 1, Math.trunc(now / A[n]), newOp);
  }
};

recurse(1, A[0], op);

console.log(max === 0 ? 0 : max);
console.log(min === 0 ? 0 : min);

체감 난이도

이유

원래는 하였는데,

이상한 곳에서 막혀서 중으로 올렸다.

회고

js에는 +0-0이라는 개념이 있는데, 이를 몰랐다.

0/-3을 하면 -0이 된다.

그리고 이 값은 console.log-0으로 출력이 되기 때문에 백준에서 오류로 잡아낸다.

console.log(max === 0 ? 0 : max);
console.log(min === 0 ? 0 : min);

이걸 몰라서 오랫동안 헤맸다.

만약 이를 해결하고 싶으면 위와같은 방법으로 처리해야한다.

왜냐하면 +0 0 -0 모두 서로 같은 값으로 취급하기 때문이다.

그래서 저 방법을 통해서 진짜 0으로 만들어 console로 표시해야한다.

그리고 몇가지 자질구레한 실수가 더 있었다.


  1. 원본 ops를 그대로 사용하면 복구가 되지 않는다.
  2. 한쪽 끝까지 찍고 백스텝하고 나서 다음 경우의 수를 진행하려 할 때 값이 복구되지 않으므로 연산자를 사용할 수 없다
  3. 오류가 난다

이 부분도 문제를 풀 때 꼭 체크하고 넘어가야겠다.

이를 제외하면 딱히 어려움은 없었다.

그리고 첫 기준을 아래와 같이 잡으면 좀 더 코드가 간결해짐을 알았다.

let min = Infinity;
let max = -Infinity;
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함