[Boj_1584] ๊ฒŒ์ž„

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

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

 

โ–ธ ๋ฌธ์ œ

์„ธ์ค€์ด๋Š” ์œ„ํ—˜ํ•œ ์ง€์—ญ์—์„œ ํƒˆ์ถœํ•˜๋Š” ๊ฒŒ์ž„์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ด ๊ฒŒ์ž„์—๋Š” ์„ธ์ค€์ด๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋Š” ์ฃฝ์Œ์˜ ๊ตฌ์—ญ์ด ์žˆ๊ณ , ๋“ค์–ด๊ฐ€์„œ ํ•œ ๋ฒˆ ์›€์ง์ผ ๋•Œ ๋งˆ๋‹ค ์ƒ๋ช…์ด 1์”ฉ ์†Œ๋ชจ๋˜๋Š” ์œ„ํ—˜ํ•œ ๊ตฌ์—ญ์ด ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์ž์œ ๋กญ๊ฒŒ ์ƒ๋ช…์˜ ์œ„ํ˜‘์—†์ด ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ํ•œ ๊ตฌ์—ญ์ด ์žˆ๋‹ค. (์•ˆ์ „ํ•œ ๊ตฌ์—ญ์€ ์ฃฝ์Œ์˜ ๊ตฌ์—ญ๊ณผ ์œ„ํ—˜ํ•œ ๊ตฌ์—ญ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์ด๋‹ค.)

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

์„ธ์ค€์ด๊ฐ€ (0, 0)์—์„œ (500, 500)์œผ๋กœ ๊ฐˆ ๋•Œ ์žƒ๋Š” ์ƒ๋ช…์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์œ„ํ—˜ํ•œ ๊ตฌ์—ญ์˜ ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” X1 Y1 X2 Y2์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์œ„ํ—˜ํ•œ ๊ตฌ์—ญ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (X1, Y1)์€ ์œ„ํ—˜ํ•œ ๊ตฌ์—ญ์˜ ํ•œ ๋ชจ์„œ๋ฆฌ์ด๊ณ , (X2, Y2)๋Š” ์œ„ํ—˜ํ•œ ๊ตฌ์—ญ์˜ ๋ฐ˜๋Œ€ ๋ชจ์„œ๋ฆฌ์ด๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„์—๋Š” ์ฃฝ์Œ์˜ ๊ตฌ์—ญ์˜ ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์—๋Š” ์ฃฝ์Œ์˜ ๊ตฌ์—ญ์˜ ์ •๋ณด๊ฐ€ ์œ„ํ—˜ํ•œ ๊ตฌ์—ญ์˜ ์ •๋ณด์™€ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค. ์ฃผ์–ด์ง€๋Š” ๊ตฌ์—ญ์€ ๋ชจ๋‘ ๊ฒน์น  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„œ๋กœ ๋‹ค๋ฅธ ๊ตฌ์—ญ์ด ๊ฒน์น  ๋•Œ๋Š”, ๋” ์‹ฌํ•œ ๊ตฌ์—ญ์ด ํ•ด๋‹น๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฃฝ์Œ+์œ„ํ—˜ = ์ฃฝ์Œ, ์œ„ํ—˜+์•ˆ์ „ = ์œ„ํ—˜, ์œ„ํ—˜+์œ„ํ—˜ = ์œ„ํ—˜, ์ฃฝ์Œ+์•ˆ์ „ = ์ฃฝ์Œ์ด๋‹ค. ์œ„ํ—˜ํ•œ ๊ตฌ์—ญ์ด ์•„๋ฌด๋ฆฌ ๊ฒน์ณ๋„ ์ƒ๋ช…์€ 1์”ฉ ๊ฐ์†Œ๋œ๋‹ค. ์ƒ๋ช…์˜ ๊ฐ์†Œ๋Š” ๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ๋•Œ๋งŒ, ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, (500, 500)์ด ์œ„ํ—˜ํ•œ ๊ตฌ์—ญ์ผ ๋•Œ๋Š”, (500, 500)์— ๋“ค์–ด๊ฐˆ ๋•Œ, ์ƒ๋ช…์ด 1 ๊ฐ์†Œ๋˜์ง€๋งŒ, (0, 0)์ด ์œ„ํ—˜ํ•œ ๊ตฌ์—ญ์ด๋”๋ผ๋„ ์ƒ๋ช…์€ ๊ฐ์†Œ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, (0, 0)์ด ์ฃฝ์Œ์˜ ๊ตฌ์—ญ์ด๋”๋ผ๋„ ์„ธ์ค€์ด๋Š” ์ด๋ฏธ ๊ทธ ๊ณณ์— ์žˆ์œผ๋ฏ€๋กœ ์„ธ์ค€์ด์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค. N๊ณผ M์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ •๋‹ต์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ (500, 500)์œผ๋กœ ๊ฐˆ ์ˆ˜ ์—†์„ ๋•Œ๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

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

  • ๐Ÿฅ‡ ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 5
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๊ทธ๋ž˜ํ”„ ์ด๋ก , ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰, ์ตœ๋‹จ ๊ฒฝ๋กœ, ๋ฐ์ดํฌ์ŠคํŠธ๋ผ, 0-1 ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

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

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

 

์ „์ฒด ๋งต์˜ ํฌ๊ธฐ๊ฐ€ 500x500์ด๊ณ , N+M์˜ ์ตœ๋Œ€์น˜๋Š” 100์ด๋ฏ€๋กœ O(100*500*500) = O(25,000,000)์ด๊ธฐ ๋•Œ๋ฌธ์—

์œ„ํ—˜ ๊ตฌ์—ญ, ์ฃฝ์Œ ๊ตฌ์—ญ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ง์ ‘ ๋งต์— ๊ธฐ๋กํ–ˆ๋‹ค.

 

์ฃฝ์Œ ๊ตฌ์—ญ, ์œ„ํ—˜ ๊ตฌ์—ญ, ์•ˆ์ „ ๊ตฌ์—ญ์ด ๋ชจ๋‘ ์ •ํ•ด์กŒ์œผ๋‹ˆ,

๋‹ค์ต์ŠคํŠธ๋ผ ๋˜๋Š” 0-1 ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‚˜์˜ ๊ฒฝ์šฐ๋Š”  0-1 ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

 

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

 

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

๋ฉ”๋ชจ๋ฆฌ : 23900KB
์‹œ๊ฐ„ : 276ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    static final int INF = 987654321;
    static final int WARNING = 1;
    static final int DEATH = 2;
    static int[][] map;
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    static PriorityQueue<Pos> pq;
    static public class Pos implements Comparable<Pos> {
        int x; int y;
        int dist;
        public Pos (int x, int y, int dist) {
            this.x = x; this.y = y;
            this.dist = dist;
        }
        @Override
        public int compareTo(Pos o) {
            return this.dist - o.dist;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        map = new int[501][501];
        int n = Integer.parseInt(br.readLine()); // ์œ„ํ—˜ํ•œ ๊ตฌ์—ญ์˜ ์ˆ˜
        StringTokenizer st;
        // ์œ„ํ—˜ํ•œ ๊ตฌ์—ญ์˜ ์ •๋ณด
        int x1, y1, x2, y2;
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            x1 = Integer.parseInt(st.nextToken());
            y1 = Integer.parseInt(st.nextToken());
            x2 = Integer.parseInt(st.nextToken());
            y2 = Integer.parseInt(st.nextToken());

            // ๊ตฌ์—ญ ํ‘œ์‹œ
            marking(x1, y1, x2, y2, WARNING);
        }

        int m = Integer.parseInt(br.readLine()); // ์ฃฝ์Œ์˜ ๊ตฌ์—ญ์˜ ์ˆ˜
        // ์ฃฝ์Œ์˜ ๊ตฌ์—ญ์˜ ์ •๋ณด
        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            x1 = Integer.parseInt(st.nextToken());
            y1 = Integer.parseInt(st.nextToken());
            x2 = Integer.parseInt(st.nextToken());
            y2 = Integer.parseInt(st.nextToken());

            marking(x1, y1, x2, y2, DEATH);
        }

        int ans = bfs();

        System.out.println(ans);
    }

    private static void marking(int x1, int y1, int x2, int y2, int mark) {
        // (x1, y1) ๊ตฌ์—ญ์˜ ๋ชจ์„œ๋ฆฌ, (x2, y2) ๊ตฌ์—ญ์˜ ๋ฐ˜๋Œ€ ๋ชจ์„œ๋ฆฌ
        for (int i = Math.min(x1, x2); i <= Math.max(x1, x2); i++) {
            for (int j = Math.min(y1, y2); j <= Math.max(y1, y2); j++) {
                map[i][j] = mark;
            }
        }
    }

    private static int bfs() {
        int[][] dist = new int[501][501];
        for (int[] row : dist) Arrays.fill(row, INF);

        pq = new PriorityQueue<>();
        pq.offer(new Pos(0, 0, 0));
        dist[0][0] = 0;

        while (!pq.isEmpty()) {
            Pos now = pq.poll();
            int nowDist = now.dist;

            for (int d = 0; d < 4; d++) {
                int nx = dx[d] + now.x;
                int ny = dy[d] + now.y;

                // ๋ฒ”์œ„ ์ฒดํฌ, ์ฃฝ์Œ์˜ ๊ตฌ์—ญ X
                if (rangeCheck(nx, ny) || map[nx][ny] == DEATH) continue;

                if (dist[nx][ny] <= nowDist + map[nx][ny]) continue;

                dist[nx][ny] = nowDist + map[nx][ny];
                
                if (map[nx][ny] == 0) pq.offer(new Pos(nx, ny, nowDist)); // ์•ˆ์ „ํ•œ ๊ตฌ์—ญ
                else pq.offer(new Pos(nx, ny, nowDist+1)); // ์œ„ํ—˜ํ•œ ๊ตฌ์—ญ
            }
        }

        return dist[500][500] == INF ? -1 : dist[500][500];
    }

    private static boolean rangeCheck(int x, int y) {
        return x < 0 || x >= 501 || y < 0 || y >= 501;
    }
}

 

ํ•ด๊ฒฐ ์™„๋ฃŒ ! ๐Ÿ”ฅ