알고리즘

백준 1107번 리모컨 (JAVA)

박카스마시며코딩 2023. 11. 9. 19:07

https://www.acmicpc.net/problem/1107

 

1107번: 리모컨

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이

www.acmicpc.net

 

저는 구현을 통해 문제를 해결하였습니다.

0부터 1_000_000까지 해당 숫자가 n 까지 도달하는데 얼마나 걸리는지를 확인하였습니다.

이때 해당 숫자에 고장난 버튼이 있다면, 그 숫자는 카운트하지 않았고, 처음 초기화는 시작이 100 이기 때문에 |100-n|으로 초기화하여 문제를 풀었습니다.

 

package BOJ.etc;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;

public class BOJ_1107 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int m = Integer.parseInt(br.readLine());
        Set<Integer> isBroken = new HashSet<>();
        if(m != 0){
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int i = 0; i < m; i++) {
                int num = Integer.parseInt(st.nextToken());
                isBroken.add(num);
            }
        }
        int result = cal(n, isBroken);
        System.out.println(result);
    }
    private static final int PUSH_BROKEN = -1;
    private static int cal(int n, Set<Integer> isBroken) {
        int result = Math.abs(n - 100);
        for(int i = 0 ; i <= 1_000_000 ; i++){
            int length = check(i,isBroken);
            if(length == PUSH_BROKEN){
                continue;
            }
            result = Math.min(result,length + Math.abs(i-n));
        }
        return result;
    }

    private static int check(int num, Set<Integer> isBroken) {
        if(num == 0 && isBroken.contains(0)){
            return PUSH_BROKEN;
        }
        if(num == 0){
            return 1;
        }
        int cnt = 0;
        while(num > 0){
            if(isBroken.contains(num%10)){
                return PUSH_BROKEN;
            }
            num /= 10;
            cnt++;
        }
        return cnt;
    }

}