[백준 / BOJ] 1107번 리모컨 ( Node js / Javascript )
2024. 3. 29. 14:56ㆍ코딩 테스트 (BOJ)
문제 풀이
고장나지 않은 버튼들만을 이용해서 목표 채널까지 버튼을 가장 적게 눌러 도착하면 된다.
그런데 입력 조건을 보면 목표 채널의 최대값이 500,000인 것을 확인할 수 있다.
즉, 채널을 1부터 하나씩 모두 검사해도 처리시간이 매우 적게 나온다는 것이다.
그렇다면 이 문제는 브루트포스를 사용해 손쉽게 해결할 수 있을 것 같다.
그렇다면 우리는 최악의 경우인 목표 채널이 500,000 번이고, 9를 제외한 모든 숫자가 고장났다고 했을 때를 감안한다면
우리가 숫자를 직접 눌러 이동할 채널의 최대값은 999,999로 설정할 수 있다.
그러니 채널을 1 부터 999,999 까지 계산하여 몇번 채널에서 가는 것이 가장 버튼을 적게 누르는지 찾으면 된다.
그리고 마지막으로, 숫자 버튼을 사용하지 않고 바로 + , - 버튼을 눌러 100에서 출발하는 경우의 수까지 추가해주면 되겠다.
전체 코드
const fs = require("fs");
let [N, M, wrongButtons] = fs
.readFileSync("./input.txt")
.toString()
.trim()
.split("\n")
.map((item) => item.split(" ").map((item) => Number(item)));
if (M[0] === 0) {
cnt1 = Math.abs(N[0] - 100);
cnt2 = N[0].toString().length;
console.log(cnt1 > cnt2 ? cnt2 : cnt1);
} else {
let cnt1 = Infinity;
let cnt2 = Infinity;
cnt1 = Math.abs(N[0] - 100);
for (let i = 0; i < 1000000; i++) {
let channel = i.toString();
if (wrongButtons.some((item) => channel.includes(item.toString()))) {
continue;
}
let cnt = Math.abs(N[0] - i) + channel.length;
if (cnt2 > cnt) cnt2 = cnt;
}
console.log(cnt1 > cnt2 ? cnt2 : cnt1);
}
M[0] === 0이란 조건을 설정한 이유는 틀린 버튼이 하나도 없을 경우 입력값을 처리하는 과정에서 에러가 발생할 수 있기 때문이다.
'코딩 테스트 (BOJ)' 카테고리의 다른 글
[백준 / BOJ] 17114번 하이퍼 토마토 (Javascript / Node js) (0) | 2024.05.26 |
---|---|
[백준 / BOJ] 7576번 토마토 ( Node js / Javascript ) (0) | 2024.05.22 |
[백준 / BOJ] 1074번 Z ( Javascript / Node js ) (0) | 2024.03.22 |
[백준 / BOJ] 1012번 유기농 배추 ( Javascript / Node js ) (1) | 2024.03.20 |
[BOJ / 백준] 18111번 마인크래프트 ( Node js / Javascript ) (0) | 2024.03.15 |