๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ProgramSolve/Baekjoon

[BOJ] 12851๋ฒˆ - ์ˆจ๋ฐ”๊ผญ์งˆ2 (Java)

by SooooooooS 2023. 12. 4.
728x90

๐Ÿ› ๏ธ ๋ฌธ์ œ ๐Ÿ› ๏ธ


๐Ÿ—’๏ธ ์„ค๋ช… ๐Ÿ—’๏ธ

์ด๋ฒˆ ๋ฌธ์ œ์—์„œ ๋‚ด๊ฐ€ ์ž˜๋ชป ์ƒ๊ฐํ–ˆ๋˜ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๊ธฐ๋กํ•ด๋‘๋ ค๊ณ  ํ•œ๋‹ค.

์šฐ์„  ๊ธฐ์–ตํ•ด์•ผํ•  ๊ฒƒ์€ BFS๋Š” ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ์ฒ˜์Œ ๋™์ƒ์˜ ์œ„์น˜์— ๋„์ฐฉํ•˜๋ฉด(answer = 0) ๊ทธ ๋•Œ ์‹œ๊ฐ„์ด ์ตœ์†Œ์‹œ๊ฐ„์ด ๋œ๋‹ค.

 

์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ์ƒ๊ฐํ•˜๊ณ  ์ž‘์„ฑํ•œ ์ฝ”๋“œ ์ค‘ queue ์‚ฝ์ž…๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ์ด๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ ์ฝ”๋“œ

์œ„์™€ ๊ฐ™์ด ๋‹จ์ง€ next์œ„์น˜์—์„œ ๋„๋‹ฌํ•œ ์‹œ๊ฐ„์ด ์ตœ์†Œ ์‹œ๊ฐ„๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋ฌด์กฐ๊ฑด queue์— ๋„ฃ๋„๋ก ํ–ˆ๋‹ค. 

ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ  ๊ทธ ์ด์œ ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณด์•˜๋‹ค.

ํ˜„์žฌ ์ฝ”๋“œ๋กœ๋Š” ๋„์ฐฉ์ง€์ ๊ณผ ํ˜„์žฌ ์ง€์ ์˜ ๊ฑฐ๋ฆฌ์™€ ์ƒ๊ด€์—†์ด ํ˜„์žฌ ์‹œ๊ฐ„์ด ์ตœ์†Œ ์‹œ๊ฐ„๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋ฌด์กฐ๊ฑด ํ์— ์‚ฝ์ž…ํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ ˆ๋Œ€ ์ตœ์†Œ์‹œ๊ฐ„์— ๋„์ฐฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋„ ํ์— ์กด์žฌํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ตœ์•…์˜ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด queue์—์„œ 1๊ฐœ๋ฅผ ๋นผ๊ณ  3๊ฐœ๊ฐ€ ๋“ค์–ด๊ฐ€ 2๊ฐœ์”ฉ ์Œ“์ด๋Š” ์ƒํ™ฉ์ด ๊ณ„์† ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ ๋™์ƒ๊ณผ ์ˆ˜๋นˆ์ด์˜ ์œ„์น˜๊ฐ€ ๋งค์šฐ ํฐ ์ฐจ์ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ๋‹น์—ฐํžˆ queue์˜ ๊ธธ์ด๋Š” ๋งค์šฐ ๊ธธ์–ด์งˆ ๊ฒƒ์ด๋‹ค.

 

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ํ์— ์‚ฝ์ž…ํ•˜๋Š” ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

๋„์ฐฉ ์ง€์ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ˜„์žฌ ์œ„์น˜๊นŒ์ง€๋„ ์ตœ์†Œ ์‹œ๊ฐ„์œผ๋กœ ๋„๋‹ฌํ•ด์•ผ ๋„์ฐฉ๊นŒ์ง€ ์ตœ์†Œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

์ฆ‰, ํ˜„์žฌ ์œ„์น˜๊นŒ์ง€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋„๋‹ฌํ•˜๋”๋ผ๋„ ์ตœ์†Œ ์‹œ๊ฐ„์ด๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

visited ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ํ˜„์žฌ ์ •์ ์— ๋„๋‹ฌํ•˜๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•ด๋‘˜ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

์œ„์—์„œ BFS์˜ ํŠน์„ฑ์„ ๋งํ–ˆ๋“ฏ์ด ํ˜„์žฌ ์ •์ ์— ๋„๋‹ฌํ•œ ์ˆœ๊ฐ„ ๊ทธ ์‹œ๊ฐ„์ด ์ตœ์†Œ์‹œ๊ฐ„์ด ๋ ๊ฒƒ์ด๋‹ค.

visited = 0์ผ ๊ฒฝ์šฐ ๋ฐฉ๋ฌธ ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ํ˜„์žฌ ๋„์ฐฉํ•œ ์‹œ๊ฐ„์ด ์ตœ์†Œ์‹œ๊ฐ„์ด ๋˜๋ฏ€๋กœ ์ด๋ฅผ ๊ธฐ๋กํ•ด๋‘๋ก ํ–ˆ๋‹ค.

์žฌ๋ฐฉ๋ฌธํ•  ๋•Œ(visited != 0) ํ˜„์žฌ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์— ๋„๋‹ฌํ–ˆ์„ ๊ฒฝ์šฐ์—๋งŒ ํ์— ์‚ฝ์ž…ํ•˜๋„๋ก ํ•˜์—ฌ ์‚ฝ์ž… ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

์ •๋‹ต ์ฝ”๋“œ


๐Ÿ€ ํ’€์ด ๐Ÿ€

package Baekjoon;

import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Graph12851 {
    public static class Node {
        int x, time;
        public Node(int x, int time) {
            this.x = x;
            this.time = time;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int start = Integer.parseInt(st.nextToken());
        int end = Integer.parseInt(st.nextToken());

        if(start >= end) { //๋งŒ์•ฝ ์ˆ˜๋นˆ์ด๊ฐ€ ๋™์ƒ๋ณด๋‹ค ์•ž์— ์žˆ์„ ๊ฒฝ์šฐ ๋’ค๋กœ๋งŒ ๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ๋„์ฐฉ
            System.out.println(start-end);
            System.out.println(1);
            return;
        }
        bfs(start, end);
    }

    /**
     * ์ตœ์†Œ ์‹œ๊ฐ„๊ณผ ๋ฐฉ๋ฒ•์˜ ๊ฐœ์ˆ˜ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜
     * @param s ์ˆ˜๋นˆ์ด์˜ ์‹œ์ž‘ ์œ„์น˜
     * @param e ๋™์ƒ์ด ์žˆ๋Š” ๋„์ฐฉ ์œ„์น˜
     */
    public static void bfs(int s, int e) {
        int answer = 0;
        int minTime = Integer.MAX_VALUE;
        int[] visited = new int[100001];

        Queue<Node> queue = new LinkedList<>();
        queue.offer(new Node(s, 0));

        while(!queue.isEmpty()) {
            Node current = queue.poll();

            if(minTime < current.time) {
                continue;
            }

            if(current.x == e) {
                if(answer == 0) { //BFS๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์— ๋„๋‹ฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ์ตœ์†Œ ์‹œ๊ฐ„
                    minTime = current.time;
                }

                if(current.time == minTime) {
                    answer++;
                    continue;
                }
            }

            int[] next = {current.x-1, current.x+1, current.x*2};
            for(int i = 0; i < 3; i++) {
                if(next[i] < 0 || next[i] > 100000) {
                    continue;
                }

                //0์ผ ๊ฒฝ์šฐ ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†์œผ๋ฏ€๋กœ ํ˜„์žฌ ์‹œ๊ฐ„์ด ์ตœ์†Œ ์‹œ๊ฐ„
                //ํ˜„์žฌ ์ •์ ์— ์ตœ์†Œ์‹œ๊ฐ„์œผ๋กœ ๋„๋‹ฌํ•ด์•ผ ๋™์ƒ์˜ ์œ„์น˜๊นŒ์ง€ ์ตœ์†Œ๋กœ ์˜ฌ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ
                if(visited[next[i]] == 0 || visited[next[i]] == current.time + 1) {
                    visited[next[i]] = current.time + 1;
                    queue.offer(new Node(next[i], current.time+1));
                }
            }
        }

        System.out.println(minTime);
        System.out.println(answer);
    }
}
728x90