수빈이는 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);
}