본문 바로가기

PS/Problems

[Java] 백준 1107번 리모컨 - 브루트포스

예외 케이스가 너무 많아 고통스러웠다

너무 힘들었다...

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());
        }
    }
}