[백준 / BOJ] 1107번 리모컨 ( Node js / Javascript )

2024. 3. 29. 14:56코딩 테스트 (BOJ)

 

1107번: 리모컨

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이

www.acmicpc.net

 

문제 풀이

 

고장나지 않은 버튼들만을 이용해서 목표 채널까지 버튼을 가장 적게 눌러 도착하면 된다. 

그런데 입력 조건을 보면 목표 채널의 최대값이 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이란 조건을 설정한 이유는 틀린 버튼이 하나도 없을 경우 입력값을 처리하는 과정에서 에러가 발생할 수 있기 때문이다.