예외 케이스가 너무 많아 고통스러웠다
너무 힘들었다...
import java.util.*;
import java.io.*;
public class Main{
static boolean[] check = new boolean[10];
static PrintWriter pw = new PrintWriter(System.out);
public static void main(String[] args){
FastScanner fs = new FastScanner();
int n = fs.nextInt();
int T = fs.nextInt();
if (T != 0) for (int i : fs.readArray(T)) check[i] = true;
boolean flag1 = true;
boolean flag2 = true;
// 1. n은 입력 가능한가?
// 2. n보다 크고 작은 수들 중 가장 가까운 것 2개를 탐색 (존재하지 않으면 -1 반환)
// 3. 채널 100에서 이동할 때의 이동 횟수
// 위의 1,2,3 모두를 비교해한다!
int ans = Integer.MAX_VALUE;
if (isValid(n)) ans = Integer.toString(n).length();
int upper = findUpper(n + 1);
if (upper == -1) flag1 = false;
int lower = findLower(n - 1);
if (lower == -1) flag2 = false;
ans = Math.min(ans, (int)Math.abs(100 - n));
if (flag1) ans = Math.min(ans, Integer.toString(upper).length() + (int)Math.abs(upper - n));
if (flag2) ans = Math.min(ans, Integer.toString(lower).length() + (int)Math.abs(lower - n));
pw.println(ans);
pw.close();
}
static boolean isValid(int n){
String str = Integer.toString(n);
for (int i=0;i<str.length();i++) if (check[str.charAt(i) - 48]) return false;
return true;
}
static char[] ary;
static int findUpper(int k){
String str = Integer.toString(k);
ary = new char[str.length() + 1];
ary[0] = '0';
for (int i=1;i<=str.length();i++) ary[i] = str.charAt(i - 1);
int ptr = 1;
while (ptr < ary.length){
if (ary[ptr] < 58 && !check[ary[ptr] - '0']){
ptr++;
continue;
}
for (int i=ptr+1;i<ary.length;i++) ary[i] = '0';
if (ary[ptr] != 58){
ary[ptr]++;
}
else{
ary[ptr] = '0';
ptr--;
if (ptr == -1) return -1;
ary[ptr]++;
}
}
int ans = 0;
for (int i=0;i<ary.length;i++){
ans += Math.pow(10, ary.length - i - 1) * (ary[i] - '0');
}
return ans;
}
static char[] ary2;
static int findLower(int k){
if (k == -1) return -1;
String str = Integer.toString(k);
ary2 = new char[str.length()];
for (int i=0;i<ary2.length;i++) ary2[i] = str.charAt(i);
int ptr = 0;
int fore = 0;
// fore : 가장 높은 자릿수의 위치
while (ptr < ary2.length){
if (ary2[ptr] >= 48 && !check[ary2[ptr] - '0']){
ptr++;
continue;
}
for (int i=ptr+1;i<ary2.length;i++) ary2[i] = '9';
if (ary2[ptr] != 47){
ary2[ptr]--;
}
else{
if (fore == ptr){
ary2[ptr] = '0';
ptr++;
fore++;
continue;
}
ary2[ptr] = '9';
ptr--;
if (ptr == -1) return -1;
ary2[ptr]--;
}
}
int ans = 0;
for (int i=0;i<ary2.length;i++){
ans += Math.pow(10, ary2.length - i - 1) * (ary2[i] - '0');
}
if (ans == 0 && check[0]) return -1;
return ans;
}
static void sort(int[] a){
ArrayList<Integer> L = new ArrayList<>();
for (int i : a) L.add(i);
Collections.sort(L);
for (int i = 0; i < a.length; i++) a[i] = L.get(i);
}
static class FastScanner{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer("");
String next(){
while (!st.hasMoreTokens()){
try{
st = new StringTokenizer(br.readLine());
}catch (IOException e){
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt(){
return Integer.parseInt(next());
}
int[] readArray(int n){
int[] a = new int[n];
for (int i = 0; i < n; i++) a[i] = nextInt();
return a;
}
long nextLong(){
return Long.parseLong(next());
}
}
}
'PS > Problems' 카테고리의 다른 글
[Java] 백준 1753번 최단경로 - 다익스트라 (0) | 2022.01.08 |
---|---|
[Java] 백준 1389번 케빈 베이컨 - BFS (0) | 2022.01.08 |
[Java] CodeForces Hello 2022 B.Integer shop (0) | 2022.01.04 |
[Java] 백준 24040번 예쁜 케이크 - 정수론 (0) | 2022.01.01 |
[Java] 백준 1629번 곱셈 - 분할정복법 (0) | 2022.01.01 |