[Boj_16509] ์žฅ๊ตฐ

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

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

 

โ–ธ ๋ฌธ์ œ

์˜ค๋žœ๋งŒ์— ํœด๊ฐ€๋ฅผ ๋‚˜์˜จ ํ˜ธ๊ทผ์ด๋Š” ๋ฌธ๋“ ๋™์•„๋ฆฌ๋ฐฉ์— ์žˆ๋Š” ์žฅ๊ธฐ๊ฐ€ ํ•˜๊ณ  ์‹ถ์–ด์กŒ๋‹ค. ํ•˜์ง€๋งŒ ์žฅ๊ธฐ๋ฅผ ์˜ค๋žซ๋™์•ˆ ํ•˜์ง€ ์•Š์€ ํƒ“์ธ์ง€ ์˜ˆ์ „์—๋Š” ์ž˜ ์“ฐ๋˜ ์ƒ์„ ์ œ๋Œ€๋กœ ์“ฐ๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ํž˜๋“ค์—ˆ๋‹ค. ํ˜ธ๊ทผ์ด๋ฅผ ์œ„ํ•ด ์ƒ์„ ์–ด๋–ป๊ฒŒ ์จ์•ผ ํ• ์ง€ ๋„์™€์ฃผ์ž.

 

 

์œ„ ๊ทธ๋ฆผ์€ 10×9 ํฌ๊ธฐ์˜ ์žฅ๊ธฐํŒ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ƒ์€ (5, 4)์—, ์™•์€ (1, 4)์— ์ž๋ฆฌ ์žก๊ณ  ์žˆ๋Š” ๊ธฐ๋ฌผ์ด๋‹ค. (0, 3)๊ณผ (2, 5)๋ฅผ ๊ผญ์ง“์ ์œผ๋กœ ํ•˜๋Š” ์‚ฌ๊ฐํ˜•๊ณผ, (7, 3)๊ณผ (9, 5)๋ฅผ ๊ผญ์ง“์ ์œผ๋กœ ํ•˜๋Š” ์‚ฌ๊ฐํ˜•์€ ์™•์ด ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถ์„ฑ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ƒ์€ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด 8๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋กœ ํ•œ ์นธ์„ ์ด๋™ํ•œ ํ›„์— ๊ฐ™์€ ๋ฐฉํ–ฅ ์ชฝ ๋Œ€๊ฐ์„ ์œผ๋กœ ๋‘ ์นธ ์ด๋™ํ•œ๋‹ค.

 

 

๋งŒ์•ฝ ์ƒ์ด ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ์— ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋‹ค๋ฅธ ๊ธฐ๋ฌผ์ด ์žˆ๋‹ค๋ฉด ์ƒ์€ ๊ทธ์ชฝ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค. ๋˜ํ•œ, ์ƒ์ด ์žฅ๊ธฐํŒ์„ ๋ฒ—์–ด๋‚  ์ˆ˜๋„ ์—†๋‹ค.

10×9 ํฌ๊ธฐ์˜ ์žฅ๊ธฐํŒ ์œ„์— ์ƒ๊ณผ ์™•์˜ ์ฒ˜์Œ ์œ„์น˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ƒ์ด ์™•์—๊ฒŒ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜์—ฌ๋ผ.

 

โ–ธ ์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์ƒ์˜ ์œ„์น˜๋ฅผ ์˜๋ฏธํ•˜๋Š” ์ •์ˆ˜ R1, C1์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” ์™•์˜ ์œ„์น˜๋ฅผ ์˜๋ฏธํ•˜๋Š” ์ •์ˆ˜ R2, C2๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์žฅ๊ธฐํŒ์—์„œ Ri (0 ≤ Ri ≤ 9)๋Š” ํ–‰์„, Ci (0 ≤ Ci ≤ 8)๋Š” ์—ด์„ ์˜๋ฏธํ•œ๋‹ค.

์™•์€ ํ•ญ์ƒ ๊ถ์„ฑ์— ์ž๋ฆฌ ์žก๊ณ  ์žˆ์œผ๋ฉฐ, ์ƒ๊ณผ ์™•์˜ ์œ„์น˜๋Š” ๊ฒน์น˜์ง€ ์•Š๋Š”๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์ƒ์ด ์™•์—๊ฒŒ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅ‡  ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 5
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๊ตฌํ˜„, ๊ทธ๋ž˜ํ”„ ์ด๋ก , ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰, ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

์œ„ ๋ฌธ์ œ๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์ƒ ์œ„์น˜์—์„œ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS)์„ ์ง„ํ–‰ํ•˜์—ฌ ์™•์—๊ฒŒ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฃผ์–ด์ง„ ๊ทœ์น™์— ๋”ฐ๋ผ ์ƒ์˜ ์ด๋™ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

 

๋จผ์ € ์ƒํ•˜์ขŒ์šฐ ๋ฐฉํ–ฅ์œผ๋กœ ํ•œ ์นธ ์ด๋™ํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ด๋™ํ•˜๋ ค๋Š” ์œ„์น˜๊ฐ€ ๋ฒ”์œ„ ๋‚ด์— ์žˆ์œผ๋ฉฐ, ๊ทธ ์œ„์น˜์—  ๋‹ค๋ฅธ ๊ธฐ๋ฌผ์ด ์—†์„ ๊ฒฝ์šฐ์—๋งŒ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ด๋™ ํ›„, ํ•ด๋‹น ์œ„์น˜์—์„œ ๋‘ ๊ฐœ์˜ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์„ ๊ฒ€์‚ฌํ•œ๋‹ค. ๊ฐ ์ƒํ•˜์ขŒ์šฐ ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ๋‘ ๊ฐœ์˜ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์„ ๋งค์นญํ•˜์—ฌ, ์ฒซ ๋ฒˆ์งธ ๋Œ€๊ฐ์„  ์ด๋™์ด ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ, ๊ทธ ์œ„์น˜์—์„œ ๋‘ ๋ฒˆ์งธ ๋Œ€๊ฐ์„  ์ด๋™์„ ์ง„ํ–‰ํ•œ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋•Œ ์ด๋™ํ•˜๋ ค๋Š” ์œ„์น˜๊ฐ€ ๋ฒ”์œ„ ๋‚ด์— ์žˆ์œผ๋ฉฐ, ๊ทธ ์œ„์น˜์—  ๋‹ค๋ฅธ ๊ธฐ๋ฌผ์ด ์—†์„ ๊ฒฝ์šฐ์—๋งŒ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๊ทœ์น™์— ๋”ฐ๋ผ ์ด๋™์„ ๋งˆ์นœ ํ›„, ์ตœ์ข…์ ์œผ๋กœ ๋„๋‹ฌํ•œ ์œ„์น˜๊ฐ€ ๋ฒ”์œ„ ๋‚ด์— ์žˆ๊ณ  ๋ฐฉ๋ฌธํ•œ ์  ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ์— ์ถ”๊ฐ€ํ•˜์—ฌ ํƒ์ƒ‰์„ ๊ณ„์†ํ•œ๋‹ค.

 

ํ์—์„œ ๊บผ๋‚ธ ํ˜„์žฌ ์œ„์น˜๊ฐ€ ์™•์˜ ์œ„์น˜์™€ ๊ฐ™๋‹ค๋ฉด, ํ•ด๋‹น ์ด๋™ ํšŸ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋งŒ์•ฝ ๋ชจ๋“  ํƒ์ƒ‰์„ ๋งˆ์ณค๋Š”๋ฐ๋„ ์™•์— ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์œ„ ํ’€์ด๋ฅผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

โœ” ์ตœ์ข… ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 11592KB
์‹œ๊ฐ„ : 64ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    static final int n = 10, m = 9; // ์žฅ๊ธฐํŒ ํฌ๊ธฐ
    static int r, c;
    static int r2, c2;
    static boolean[][] checked;
    static public class Pos {
        int x; int y; int cnt;
        public Pos(int x, int y, int cnt) {
            this.x = x; this.y = y; this.cnt = cnt;
        }
    }
    // ์šฐํ•˜์ขŒ์ƒ
    static int[] dx = {0, 1, 0, -1};
    static int[] dy = {1, 0, -1, 0};
    // ๋Œ€๊ฐ์„ 
    static int[] zx = {-1, 1, 1, -1};
    static int[] zy = {1, 1, -1, -1};
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        // ์ƒ์˜ ์œ„์น˜
        r = Integer.parseInt(st.nextToken());
        c = Integer.parseInt(st.nextToken());
        st = new StringTokenizer(br.readLine());
        // ์™•์˜ ์œ„์น˜
        r2 = Integer.parseInt(st.nextToken());
        c2 = Integer.parseInt(st.nextToken());

        checked = new boolean[n][m];

        int ans = bfs(r, c);

        System.out.println(ans);
    }

    private static int bfs(int r, int c) {
        Queue<Pos> que = new LinkedList<>();
        checked[r][c] = true;
        que.offer(new Pos(r, c, 0));

        while (!que.isEmpty()) {
            Pos now = que.poll();

            if (now.x == r2 && now.y == c2) { // ์™• ๋งˆ์ฃผ์น˜๋ฉด ์ด๋™ํšŸ์ˆ˜ ๋ฐ˜ํ™˜
                return now.cnt;
            }

            for (int d = 0; d < 4; d++) {
                // ๋จผ์ € ์ƒํ•˜์ขŒ์šฐ์— ๋”ฐ๋ผ ํ•œ ์นธ ์ด๋™
                int nx = dx[d] + now.x;
                int ny = dy[d] + now.y;

                if (isPossible(nx, ny)) {
                    for (int cnt = 0; cnt < 2; cnt++) { // ๋‘ ๊ฐœ์˜ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ ํƒ์ƒ‰
                        // ์ด๋™ ๋ฐฉํ–ฅ
                        int z = (d+cnt) % 4;
                        // ๋Œ€๊ฐ์„ ์œผ๋กœ ํ•œ ์นธ ์ด๋™
                        int nzx = nx + zx[z];
                        int nzy = ny + zy[z];

                        if (isPossible(nzx, nzy)) {
                            // ๊ธฐ๋ฌผ์ด ์—†๋‹ค๋ฉด ๋‚˜๋จธ์ง€ ํ•œ ์นธ ์ด๋™
                            nzx += zx[z];
                            nzy += zy[z];
                            
                            if (rangeCheck(nzx, nzy) && !checked[nzx][nzy]) {
                                que.offer(new Pos(nzx, nzy, now.cnt+1));
                                checked[nzx][nzy] = true;
                            }
                        }
                    }
                }
            }
        }

        return -1;
    }

    // ์ด๋™ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ
    private static boolean isPossible(int x, int y) {
        if (x == r2 && y == c2) return false; // ์ƒ์ด ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ์— ์™•์ด ์žˆ์œผ๋ฉด ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ ๋ถˆ๊ฐ€
        return rangeCheck(x, y); // ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š”์ง€ ํ™•์ธ
    }

    private static boolean rangeCheck(int x, int y) {
        return x >= 0 && x < n && y >= 0 && y < m;
    }
}

 

์ƒํ•˜์ขŒ์šฐ ์ด๋™์— ๋”ฐ๋ผ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ ์ด๋™์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด ์ค˜์•ผ ํ• ์ง€ ๊ฝค ๊ณ ๋ฏผํ–ˆ๋‹ค.

dx, dy ๋ฐฐ์—ด๊ณผ zx, zy ๋ฐฐ์—ด์„ ๊ฐ ์ƒํ•˜์ขŒ์šฐ ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ๋‘ ๊ฐœ์˜ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ๊ณผ ๋งค์นญํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.

์ดํ›„, z = (d + cnt) % 4 ๋ฐฉ์‹์œผ๋กœ ๊ฐ ์ƒํ•˜์ขŒ์šฐ ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด  ๋‘ ๊ฐœ์˜ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค. 

์ด ๋ฐฉ์‹์œผ๋กœ ๊ฐ ์ƒํ•˜์ขŒ์šฐ ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ๋‘ ๊ฐœ์˜ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์„ ์ฐจ๋ก€๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๋กœ์ง์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์˜ค๋žœ๋งŒ์— BFS ๋ฌธ์ œ๋ฅผ ํ’€์–ด์„œ ๊ทธ๋Ÿฐ์ง€ ์žฌ๋ฐŒ๊ฒŒ ํ’€๋ฉด์„œ ์žฌ๋ฐŒ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊น€์— ํฌ์ŠคํŒ…๊นŒ์ง€ ์™„๋ฃŒ ! ๐Ÿ˜Ž ๐Ÿ”ฅ

๋ฐ€๋ฆฐ ๋‚˜๋จธ์ง€ ํฌ์ŠคํŒ…๋„ ์–ผ๋ฅธ ํ•ด์•ผ์ง€..๐Ÿ˜‚