BOJ[1107] - 리모컨 by JavaScript
리모컨
문제
언어
- JavaScript
문제 풀이 step 1
- 완전 탐색 문제로 모든 경우의 수를 고려해서 풀면 됩니다.
- 범위는 0 ~ 999999 로 충분히 가능한 범위입니다.
- 범위는 이동하려고 하는 채널 N의 최대 크기가 500000 이므로 자릿수만큼 9번 버튼을 누른 999999 로 정할 수 있습니다.
- 채널 N으로 이동하기 위한 방법은 2가지 입니다.
- 현재 채널 100 에서 위, 아래 버튼을 눌러서 채널 N으로 이동하는 방법
- 횟수 = Math.abs(n - 100)
- 0 ~ 999999 채널 중에서 고장나지 않은 버튼으로 만들 수 있는 채널에서 위, 아래 버튼을 눌러서 채널 N으로 이동하는 방법
- 횟수 = Math.abs(n - (0 ~ 999999)) + (0 ~ 999999)의 자릿수 (단, 고장나지 않은 버튼으로 만들 수 있는 수)
- 현재 채널 100 에서 위, 아래 버튼을 눌러서 채널 N으로 이동하는 방법
- 위의 두 방법을 만들 수 있는 모든 경우 중에서 최소값이 정답이 됩니다.
추가로 배운 점
- 고장난 채널의 개수가 0 일 수도 있는데
for(let i = 0; i < inputArr.length; i++)처럼 대충 코딩할 경우 오류가 발생합니다. - 주어진 변수
m을 이용하거나, 좀 더 빡빡하게 생각해서 코딩을 한다면 이런 오류를 피할 수 있습니다.
소스 코드 1
const input = require("fs").readFileSync("/dev/stdin").toString().split("\n");
const solution = (input) => {
const n = parseInt(input[0]);
const m = parseInt(input[1]);
const inptuArr = input[2].split(" ").map(Number);
// 망가지지 않은 버튼들
const brokens = Array(10).fill(false);
for (let i = 0; i < m; i++) {
brokens[inptuArr[i]] = true;
}
// 1. 채널 100에서 이동하는 방식
let ans = Math.abs(100 - parseInt(n));
// 1.5 0 예외 처리
if (!brokens[0]) ans = Math.min(ans, n + 1);
// 2. 채널 변경 후 이동하는 방식
for (let i = 1; i < 1000000; i++) {
let possible = true;
let num = i;
let numLength = 0;
// 각 자릿수가 고장난 버튼인지 아닌지 확인
while (num !== 0) {
if (brokens[num % 10]) {
possible = false;
break;
}
num = parseInt(num / 10);
numLength++;
}
if (!possible) continue;
ans = Math.min(ans, Math.abs(n - i) + numLength);
}
return ans;
};
console.log(solution(input));