문제 : https://www.acmicpc.net/problem/1107

key Point

  1. 숫자 누르고 +/- 버튼을 눌러야 한다.
  2. +와 -를 번갈아 누르는 것은 의미가 없다.
  3. 문제에서 가능한 채널의 개수 : 500,000개
  4. 하지만, 채널은 무한대이므로 500,000을 기준으로 0에서 +버튼을 누르는 것과 1000,000에서 -버튼을 누르는 것은 동일한 횟수를 가짐

Explain

이동할 채널 C를 구한 다음 -> C에 포함되어 있는 숫자 중에서 고장난 버튼이 있는지 확인을 한다.
고장난 버튼이 없다면 |c-N|을 계산해서 +,- 버튼을 총 몇번 눌러야 하는지 계산한다.
그리고 C가 0일 경우 예외처리를 해주어야 한다.

참고 : BufferedReader를 사용해 입력을 받으면 Runtime error 발생!

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public class Exam1107 {

static boolean[] broken = new boolean[10];
// 버튼이 고장났는지 확인하기 위한 배열
// true : 고장 false : 고장 X

static int possible(int c) {
// 채널의 길이를 구한다.
if(c == 0) {
if(broken[0] == true) {
return 0;
}else {
return 1;
}
}

int len = 0;
while(c>0) {
if(broken[c%10] == true) {
return 0;
}
len+=1;
c = c/10;
}
return len;
}

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
for(int i=0;i<m;i++) {
int button = sc.nextInt();
broken[button] = true;
}

int ans = n - 100;
if(ans<0) {
ans = -ans;
}

for(int i=0;i<=1000000;i++) {
int c = i;
int len = possible(c);
if(len>0) {
int press = c-n;
if(press<0) {
press = -press;
}
if(ans>press+len) {
ans = len+press;
}
}

}
System.out.println(ans);

}
}