리모컨
09 July 2019
문제 : https://www.acmicpc.net/problem/1107 
이번은 최적의 전략의 후보를 추린 후 모든 후보를 시도하는 문제를 풀어보도록 하겠습니다. 
import java.util.Scanner;
public class Main {
    private static int[] buttons = new int[10];
    private static int currentChannel = 100;
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int targetChannel = sc.nextInt();
        int size = sc.nextInt();
        for (int i = 0; i < size; i++) {
            int val = sc.nextInt();
            buttons[val] = 1;
        }
        int min = currentChannel - targetChannel;
        if (min < 0) {
            min *= -1;
        }
        int length = 0;
        if (min == 0) {
            System.out.println(min);
        } else {
            int diffMin = Integer.MAX_VALUE;
            for (int i = 0; i < 1000000; i++) {
                String val = String.valueOf(i);
                if (isPossibleChannel(val)) {
                    int diff = targetChannel - i;
                    if (diff < 0) {
                        diff *= -1;
                    }
                    if (diff < diffMin) {
                        diffMin = diff;
                        length = String.valueOf(i).length();
                    }
                }
            }
            System.out.println(Math.min(min, diffMin + length));
        }
    }
    private static boolean isPossibleChannel(String val) {
        for (int k = 0; k < val.length(); k++) {
            if (buttons[Integer.parseInt(String.valueOf(val.charAt(k)))] == 1) {
                return false;
            }
        }
        return true;
    }
}
채널의 제한이 500,000 이므로 넉넉히 1000,000까지 수를 체크하는데 그 중에 현재 가지고 있는 button만으로 가능한 채널을 추린 후,가장 작은 차이가 나는 값을 찾아 정답을 return해주도록 합니다.
