문제
수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장났다.
리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대 만큼 있다.
수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야하는지 구하는 프로그램을 작성하시오.
수빈이가 지금 보고 있는 채널은 100번이다.
입력
첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이 주어지며, 같은 버튼이 여러 번 주어지는 경우는 없다.
---
풀이
예외처리
1. 고장난 버튼이 있을 때와 없을 때 입력을 받을지 말지 따져야 한다.
2. 100번 채널이 타겟일 경우를 따로 고려해야 한다.
3. +, - 로만 이동할 수 있는 경우를 먼저 알아본다.
4. dfs()로 완전탐색
- 모든 경우를 돌아가며, 고장나지 않은 버튼을 눌러가며 경우의 수를 따져본다.
package boj;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_1107_리모컨 {
static int N; // 이동하려는 채널
static int M; // 고장난 버튼의 개수
static boolean[] brokens; // 고장난 버튼의 배열
static int result;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
brokens = new boolean[10];
// 1. 고장난 버튼이 있다면
if (M != 0) {
StringTokenizer st = new StringTokenizer(br.readLine());
// 고장이 난거면 true로 바꿔줌
for (int i = 0; i < M; i++) {
brokens[Integer.parseInt(st.nextToken())] = true;
}
}
// 2. 100번 채널이 목표인 경우
if (N == 100) {
System.out.print(0);
return;
}
result = Integer.MAX_VALUE;
// 3. +, -로만 이동하기
int cnt = Math.abs(100 - N);
result = result > cnt ? cnt : result;
// 4. 모든 경우 버튼 누르기
dfs(0, "");
System.out.print(result);
}
public static void dfs(int idx, String click) {
if(idx>6) return;
for (int i = 0; i < 10; i++) {
if (brokens[i])
continue;
String cur_click = click + Integer.toString(i);
int cnt = Math.abs(N - Integer.parseInt(cur_click)) + cur_click.length();
result = result > cnt ? cnt : result;
dfs(idx+1, cur_click);
}
}
}
'코딩테스트 > BOJ' 카테고리의 다른 글
[BOJ] 백준 16953 A → B (JAVA/자바) - BFS (0) | 2023.08.17 |
---|---|
[BOJ/백준] 16928 뱀과 사다리 게임 (JAVA/자바) (0) | 2023.08.15 |
[BOJ] 백준 6097 레이저통신 (JAVA/자바) (0) | 2023.08.07 |
[BOJ] 백준 3040 - 백설 공주와 일곱 난쟁이 (JAVA/자바) (0) | 2023.06.20 |
[BOJ] 5014 스타트링크 - JAVA (0) | 2023.06.14 |