본문 바로가기

OJ

[BOJ] 16397 탈출 (JAVA)

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

 

16397번: 탈출

첫 번째 줄에 N (0 ≤ N ≤ 99,999), T (1 ≤ T ≤ 99,999), G (0 ≤ G ≤ 99,999)가 공백 하나를 사이에 두고 주어진다. 각각 N은 LED로 표현된 수, T는 버튼을 누를 수 있는 최대 횟수, G는 탈출을 위해 똑같이

www.acmicpc.net

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

public class Main {
	
    public static void main(String[] args) throws Exception {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int N = Integer.parseInt(st.nextToken());
        int T = Integer.parseInt(st.nextToken());
        int G = Integer.parseInt(st.nextToken());
        boolean[] visited = new boolean[100000];
        Queue<int[]> q = new LinkedList<>();
        q.offer(new int[] { N, 0 });

        while (!q.isEmpty()) {
            int[] a = q.poll();

            if (a[0] == G) {
                System.out.print(a[1]);
                return;
            }
            if (T <= a[1]) continue;

            if (a[0] < 99999 && !visited[a[0] + 1]) {
                q.offer(new int[] { a[0] + 1, a[1] + 1 });
                visited[a[0] + 1] = true;
            }
            if (a[0] * 2 < 99999) {
                a[0] *= 2;
                int x = (int) Math.pow(10, (int) Math.log10(a[0]));
                if (visited[a[0] - x]) continue;
                q.offer(new int[] { a[0] - x, a[1] + 1 });
                visited[a[0] - x] = true;
            }
        }

        System.out.print("ANG");

    }
	
}