๊ธฐ๋ก๋ฐฉ

BOJ_1697 : ์ˆจ๋ฐ”๊ผญ์งˆ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_1697 : ์ˆจ๋ฐ”๊ผญ์งˆ

Soom_1n 2023. 2. 12. 20:08

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ

 

1697๋ฒˆ: ์ˆจ๋ฐ”๊ผญ์งˆ

์ˆ˜๋นˆ์ด๋Š” ๋™์ƒ๊ณผ ์ˆจ๋ฐ”๊ผญ์งˆ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” ํ˜„์žฌ ์  N(0 ≤ N ≤ 100,000)์— ์žˆ๊ณ , ๋™์ƒ์€ ์  K(0 ≤ K ≤ 100,000)์— ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” ๊ฑท๊ฑฐ๋‚˜ ์ˆœ๊ฐ„์ด๋™์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ, ์ˆ˜๋นˆ์ด์˜ ์œ„์น˜๊ฐ€ X์ผ

www.acmicpc.net



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • 0๋ถ€ํ„ฐ 10๋งŒ๊นŒ์ง€ ๋ฒ”์œ„์—์„œ, ์ˆ˜๋นˆ์ด์˜ ์œ„์น˜ N ๋ถ€ํ„ฐ ๋™์ƒ์˜ ์œ„์น˜ K๋กœ ์ด๋™ํ•˜๋Š” ์ตœ๋‹จ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.
    • ์ˆ˜๋นˆ์ด๊ฐ€ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ขŒ์šฐ ํ•œ์นธ(-1, +1), ์ˆœ๊ฐ„์ด๋™ (ํ˜„์œ„์น˜ *2)๊ฐ€ ์žˆ๋‹ค.
  • ์ฃผ์˜ ํ•  ์ ์€ ์ด๋™์œ„์น˜์™€ k์˜ ๊ฑฐ๋ฆฌ ์ฐจ์ด๊ฐ€ ๊ฐ€์žฅ ์ ์€ ๊ฒƒ์„ ์„ ํƒํ•˜๋Š” ๊ทธ๋ฆฌ๋”” ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
    • ๊ทธ๋ฆฌ๋””๋กœ ๋ณด๋ฉด ์˜ˆ์ œ 1๋ฒˆ์—์„œ 5 - 10 - 9 - 18 - 17 ์—์„œ 2๋ฒˆ์งธ ์ด๋™ ํ•  ๋•Œ์ธ 10์œ„์น˜์—์„œ ์ˆœ๊ฐ„์ด๋™์ด ์ ˆ๋Œ“๊ฐ’ ์ฐจ์ด๊ฐ€ 3์œผ๋กœ ๊ฐ€์žฅ ์ ์€๋ฐ, ์ •์ž‘ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋Š” ์™ผ์ชฝ ์ด๋™(-1) ํ›„ ์ˆœ๊ฐ„์ด๋™์ด ๋” ๋น ๋ฅด๋‹ค.
    • ๋”ฐ๋ผ์„œ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ๋ณด๋ฉด์„œ ๊ทธ ์ค‘ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ BFS๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int k = sc.nextInt();
        boolean[] visit = new boolean[100_001];

        Queue<Subin> que = new ArrayDeque<>();
        Subin subin = new Subin(n, 0);

        que.add(subin);

        while (!que.isEmpty()) {
            if ((subin = que.poll()).x == k) {
                break;
            }

            visit[subin.x] = true;

            if (subin.x - 1 >= 0 && !visit[subin.x - 1]) {
                que.add(new Subin(subin.x - 1, subin.ct + 1));
            }
            if (subin.x + 1 <= 100_000 && !visit[subin.x + 1]) {
                que.add(new Subin(subin.x + 1, subin.ct + 1));
            }
            if (subin.x * 2 <= 100_000 && !visit[subin.x * 2]) {
                que.add(new Subin(subin.x * 2, subin.ct + 1));
            }
        }
        System.out.println(subin.ct);
    }

    private static class Subin {
        int x, ct;

        Subin(int x, int ct) {
            this.x = x;
            this.ct = ct;
        }
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • ์ˆ˜๋นˆ์ด์˜ ํ˜„์žฌ ์œ„์น˜์™€ ์นด์šดํŠธ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก Subin ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ๋ฒˆ ๊ณ„์‚ฐํ•˜์ง€ ์•ˆ๋„๋ก boolean ๋ฐฐ์—ด visit์„ ๋งŒ๋“ค๊ณ , N์œ„์น˜๋ถ€ํ„ฐ BFS๋ฅผ ๋Œ๋ฆฐ๋‹ค.
    • n == k ๊ฐ€ ๋˜๋ฉด ๋ฐ˜๋ณต์„ ์ข…๋ฃŒํ•˜๊ณ  ํ˜„์žฌ ์นด์šดํŠธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ”ธ ์กฐ๊ธˆ ๋‹ค๋ฅธ ํ’€์ด ๐Ÿ”ธ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    private static final int MAX = 100_000;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        System.out.println(bfs(N, K));
    }

    private static int bfs(int n, int k){
        boolean[] visit = new boolean[MAX + 1];

        Queue<Subin> que = new ArrayDeque<>();
        que.offer(new Subin(n, 0));
        visit[n] = true;


        while (!que.isEmpty()) {
            Subin subin = que.poll();

            int index = subin.index-1;
            int time = subin.time+1;

            // ์™ผ์ชฝ
            if (0<= index && index <= MAX && !visit[index]){
                if (index == k) return time;
                que.offer(new Subin(index, time));
                visit[index] = true;
            }

            // ์˜ค๋ฅธ์ชฝ
            index = subin.index+1;
            if (0<= index && index <= MAX && !visit[index]){
                if (index == k) return time;
                que.offer(new Subin(index, time));
                visit[index] = true;
            }

            // ์ˆœ๊ฐ„์ด๋™
            index = subin.index*2;
            if (0<= index && index <= MAX && !visit[index]){
                if (index == k) return time;
                que.offer(new Subin(index, time));
                visit[index] = true;
            }
        }
        return -1;
    }

    private static class Subin {
        int index, time;

        public Subin(int index, int time) {
            this.index = index;
            this.time = time;
        }
    }
}
  • ํ์— ๋„ฃ๊ธฐ ์ „์— ์ •๋‹ต์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ์ฃผ์˜ ํ•  ์ ์€ n == k ์ƒํƒœ๋กœ ์‹œ๊ฐ„์ด 0์ดˆ์ธ ๊ฒฝ์šฐ์ด๋‹ค.
    • while๋ฌธ ์•ˆ์—์„œ๋Š” ๋ณ€ํ•œ ๊ฐ’์„ ๋น„๊ตํ•˜๋ฏ€๋กœ, ํ์— ๋„ฃ๊ธฐ ์ „ n๊ณผ k๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ๋ณด์ž๋งˆ์ž ๊ทธ๋ฆฌ๋””๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ , while๋ฌธ ์•ˆ์—์„œ ์ ˆ๋Œ“๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ ์˜ˆ์ œ 1๋ฒˆ์—์„œ ํ‹€๋ ธ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฑ˜๋‹ค.
    • ์•„์ง ๊ทธ๋ฆฌ๋”” ๋ถ€๋ถ„์ด ๋งŽ์ด ๋ถ€์กฑํ•œ ๊ฒƒ ๊ฐ™๋‹ค.
  • ๋ฌธ์ œ ๋ถ„์„๊ณผ ์ฝ”๋”ฉ ๊ณ„ํš์„ ์ ์–ด๊ฐ€๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.
    • ๊ทธ๋ฆฌ๋””๊ฐ€ ํ‹€๋ ธ๋‹ค๊ณ  ํŒŒ์•…ํ•œ ํ›„๋กœ ๋ธŒ๋ฃจํŠธ ํฌ์Šค์™€ BFS๋ฅผ ์ƒ๊ฐํ–ˆ๋‹ค.
    • ๋”ฐ๋กœ ๋‹ค์‹œ ์ฝ”๋”ฉ ๊ณ„ํš์„ ์ ์ง„ ์•Š์•˜๋‹ค.
  • 2ํšŒ์ฐจ๋กœ ๋‹ค์‹œ ํ’€์–ด์„œ, ํ์— ๋„ฃ๊ธฐ ์ „์— ์ •๋‹ต์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€์ดํ–ˆ๋‹ค.
    • ์ •๋‹ต์ด 0์ดˆ ์ผ๋•Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•„์„œ 1ํšŒ ํ‹€๋ ธ๋‹ค.

728x90