리모컨

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해주도록 합니다.