티스토리 뷰
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
로 표시해야한다.
그리고 몇가지 자질구레한 실수가 더 있었다.
- 원본 ops를 그대로 사용하면 복구가 되지 않는다.
- 한쪽 끝까지 찍고 백스텝하고 나서 다음 경우의 수를 진행하려 할 때 값이 복구되지 않으므로 연산자를 사용할 수 없다
- 오류가 난다
이 부분도 문제를 풀 때 꼭 체크하고 넘어가야겠다.
이를 제외하면 딱히 어려움은 없었다.
그리고 첫 기준을 아래와 같이 잡으면 좀 더 코드가 간결해짐을 알았다.
let min = Infinity;
let max = -Infinity;
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 정수 삼각형 - DP - Lv.3 (0) | 2024.10.31 |
---|---|
[프로그래머스] 길 찾기 게임 - 이진트리, 순회 - Lv.3 (1) | 2024.10.25 |
[백준][2578] 빙고 - JavaScript / JS 풀이 (0) | 2024.04.17 |
[TS] 값의 종류를 제한하자 - enum (1) | 2024.01.01 |
[알고리즘] 퀵정렬(오름차순) - 중간피벗, 재귀 사용 (0) | 2023.10.04 |