728x90

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

 

1107번: 리모컨

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

www.acmicpc.net

 

 

풀이)

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

public class Main_BJ_1107_리모컨 {
    static boolean[] broken = new boolean[10];
    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());

        if(m>0) {
            StringTokenizer st = new StringTokenizer(br.readLine());

            for (int i = 0; i < m; i++) {
                //고장난 버튼 체크
                broken[Integer.parseInt(st.nextToken())] = true;
            }
        }

        // case 1. 원하는 채널까지 +,-버튼만으로 이동
        // 초기 채널 = 100. => 초기값 설정
        int ans = Math.abs(n - 100);

        // case 2. n과 근접한 수에서  +,-으로 채널 이동
        // 완탐. 0부터 999999까지 모든 채널을 돌며 가장 적은 횟수로 이동할 수 있는 채널 찾기
        for(int i=0; i<1000000; i++){
            int num = i;
            // isPossible: 0이면 불가능, 1이면 가능
            int len = isPossible(num);
            if(len > 0){
                // adj: 숫자 버튼으로 n에 최대한 인접한 수에서 +와 -를 몇 번 눌러야 하는지 구하는 수
                int adj = Math.abs(num - n);
                if(ans > len+adj)
                    ans = len + adj;
            }
        }
        System.out.println(ans);
    }//main
    private static int isPossible(int num){
        if(num == 0){ // 0일때 예외처리
            if(broken[0])
                return 0;
            else
                return 1;
        }

        // num의 자리수 체크
        int len = 0;
        while(num > 0){
            if(broken[num%10]) // 자리수 체크하다 불가능할 경우
                return 0;
            len++;
            num /= 10;
        }
        return len;
    }//isPossible
}

아,,, 문제 풀면서 조금 어려웠다.

완탐이라고 생각도 잘 안들었고,,,ㅠㅠ

 

두 가지 케이스로 나누면 된다.

1. +,-버튼으로 모두 이동할 경우(버튼이 모두 고장났을 때로 생각하면 좋음)

2. 버튼에서 가장 인접한 번호에서 +,-버튼으로 이동할 경우

 

나머지는 주석에 달아놓았으니 참고하길!

728x90

'코테 > 백준' 카테고리의 다른 글

백준 1003 피보나치 함수(JAVA)  (0) 2023.01.15
백준 11726 2xn 타일링(JAVA)  (0) 2023.01.14
백준 1874 스택 수열(JAVA)  (0) 2023.01.13
백준 1920 수 찾기(JAVA)  (0) 2023.01.12
백준 2869 달팽이는 올라가고 싶다(JAVA)  (0) 2023.01.12

+ Recent posts