문제 원본 : https://www.acmicpc.net/problem/1107
1107번: 리모컨
첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼
www.acmicpc.net
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int m = Integer.parseInt(br.readLine());
String[] broken = null;
if (m > 0) {
broken = br.readLine().split(" ");
} else {
bw.write(String.valueOf(Math.min(Math.abs(100 - n), String.valueOf(n).length())));
bw.close();
br.close();
return;
}
int ans = Math.abs(100 - n);
for (int i = n; i >= 0; --i) {
String s = String.valueOf(i);
boolean isBroken = false;
for (int j = 0; j < broken.length; ++j) {
if (s.indexOf(broken[j]) > -1) {
isBroken = true;
break;
}
}
if (!isBroken) {
ans = Math.min(ans, s.length() + n - Integer.parseInt(s));
break;
}
}
for (int i = n; i <= 999999; ++i) {
String s = String.valueOf(i);
boolean isBroken = false;
for (int j = 0; j < broken.length; ++j) {
if (s.indexOf(broken[j]) > -1) {
isBroken = true;
break;
}
}
if (!isBroken) {
ans = Math.min(ans, s.length() + Integer.parseInt(s) - n);
break;
}
}
bw.write(String.valueOf(ans));
bw.close();
br.close();
}
}
- 고장 난 버튼이 없는 경우(m == 0)를 따로 처리해주고,
- 타깃 채널에서 위아래로 최솟값을 찾은 뒤
- 현재 채널(100번)에서 +나 - 버튼만 누르는 횟수까지 포함해서 최솟값을 찾으면 된다.