리모컨(1107)
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
60
61
62
63
64
65
66
67
import java.io.*;
import java.util.*;
public class Main{
static boolean[] rc = new boolean[10];
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine()), m = Integer.parseInt(br.readLine());
//고장난 버튼
if(m != 0){
StringTokenizer st = new StringTokenizer(br.readLine());
while(st.hasMoreTokens()){
int tmpN = Integer.parseInt(st.nextToken());
rc[tmpN] = true;
}
}
int cnt = pushCount(n);
sb.append(cnt);
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
public static int pushCount(int n){
// 원하는 채널이 100이면 현재위치
if(n == 100) return 0;
// 원하는 채널을 +-로만 이동
int cnt = Math.abs(n - 100);
for(int i = 0; i < 1000000; i++){
// 입력한 숫자 0부터 999999까지
String pushNum = String.valueOf(i);
boolean flag = true;
// 입력한 숫자에 고장난 버튼의 숫자가 있는지
for(int j = 0; j < 10; j++){
// 고장난 버튼
if(rc[j]){
// 고장난 버튼이 입력한 숫자에 포함된 숫자라면
if(pushNum.indexOf(String.valueOf(j)) != -1){
flag = false;
break;
}
}
}
if(flag){
cnt = Math.min(cnt, Math.abs(n - i) + pushNum.length());
}
}
return cnt;
}
}
풀이과정
- 처음에는 주어진 숫자에서 앞에 하나씩 수를 분리하여 사용 혹은 근사치를 찾는 알고리즘을 구현하였다.
- 예시들은 맞았지만 정답 제출을 하니 틀렸다고 나왔다.
- 반례를 찾아보니 99999 / 2 / 8 9 가 입력이 되었을 때 정답처리가 틀렸다.
- 이유는 위의 경우 100000를 입력하고 - 버튼을 눌러 7이 정답인데, 내가 구현한 것을 보면 앞자리 9를 비교하여 근사치인 7을 입력하기 때문에 정답이 높게나오게 되었다.
- 그래서 다른 사람들의 풀이를 참고해 보니 완전탐색을 이용하여 풀어야 한다고 하여, 다시 구현하였다.
- int형으로 비교하기에는 로직이 복잡해질 것 같아 String 형으로 변환하여, 고장난 버튼의 포함여부를 비교하는 식으로 하여 로직을 구현하였다.
1
2
3
- 성공
- 메모리 : 127608 KB
- 시간 : 384 ms
보안점
- 주어진 부분만을 고민을 하여 로직을 짰다.
- 좀 더 경우의 수를 생각할 수 있게 생각의 폭을 넓혀야 한다는 것을 다시 깨달았다.