[골드 5] 1107번 리모컨

Doozuu·2023년 6월 27일
0

백준 (NodeJS)

목록 보기
5/56

문제

수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장났다.

리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대 만큼 있다.

수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야하는지 구하는 프로그램을 작성하시오.

수빈이가 지금 보고 있는 채널은 100번이다.

입력

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

출력

첫째 줄에 채널 N으로 이동하기 위해 버튼을 최소 몇 번 눌러야 하는지를 출력한다.

입력 예시 분석

5457
3
6 7 8

5455로 이동 => 4번 누름
+를 두번 누르면 5457 => 2번 누름
=> 총 6번을 눌러야 한다.

500000
8
0 2 3 4 6 7 8 9

511111로 이동 => 6번 누름
-를 11111번 누르면 500000 => 11111번 누름
=> 총 11117번을 눌러야 한다.

풀이

const input = require('fs').readFileSync('ex.txt').toString().split('\n');

let result = input[0]; // 결과로 나와야 하는 값
let broken = !input[2] ? [] : input[2].split(' ').map((el) => +el); // 고장난 버튼 리스트

let btn = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
btn = btn.filter((el) => !broken.includes(el)); // 고장나지 않은 버튼만 남기기

let obj = {};
let test = {}; // 해당 숫자보다 전부 작은 값만 있을 경우를 확인하기 위한 테스트용
let answer = '';
let sorted;

// 100이면 이동할 필요가 없으므로 바로 0 출력
if (result === '100') {
  console.log(0);
} else {
  for (let j = 0; j < btn.length; j++) {
    if (btn[j] >= Number(result[0])) test[btn[j]] = btn[j] - result[0];
  }
  if (!Object.values(test).length) {
    for (let i = 0; i < result.length; i++) {
      for (let j = 0; j < btn.length; j++) {
        obj[btn[j]] = btn[j] - result[i];
      }
      sorted = Object.entries(obj).sort((a, b) => b[1] - a[1]); // 내림차순 정렬
      answer += sorted[0][0];
      obj = {};
    }
  } else {
    for (let i = 0; i < result.length; i++) {
      for (let j = 0; j < btn.length; j++) {
        if (btn[j] >= Number(result[i])) obj[btn[j]] = btn[j] - result[i];
      }
      sorted = Object.entries(obj).sort((a, b) => a[1] - b[1]); // 오름차순 정렬
      answer += sorted[0][0];
      obj = {};
    }
  }

  let dif = Math.abs(result - Number(answer));
  answer = answer.length + dif;

  console.log(answer);
}
profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글