[Boj_14466] ์†Œ๊ฐ€ ๊ธธ์„ ๊ฑด๋„ˆ๊ฐ„ ์ด์œ  6

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

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

 

โ–ธ ๋ฌธ์ œ

์†Œ๊ฐ€ ๊ธธ์„ ๊ฑด๋„ˆ๊ฐ„ ์ด์œ ๋Š” ๊ทธ๋ƒฅ ๊ธธ์ด ๋งŽ์•„์„œ์ด๋‹ค. ์กด์˜ ๋†์žฅ์—๋Š” ๊ธธ์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ, ๊ธธ์„ ๊ฑด๋„ˆ์ง€ ์•Š๊ณ ์„œ๋Š” ๋ณ„๋กœ ๋Œ์•„๋‹ค๋‹ ์ˆ˜๊ฐ€ ์—†๋‹ค.

์กด์˜ ๋†์žฅ์— ๋Œ€๋Œ€์ ์ธ ๊ฐœํŽธ์ด ์žˆ์—ˆ๋‹ค. ์ด์ œ ์ž‘์€ ์ •์‚ฌ๊ฐํ˜• ๋ชฉ์ดˆ์ง€๊ฐ€ N×N (2 ≤ N ≤ 100) ๊ฒฉ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ธ์ ‘ํ•œ ๋ชฉ์ดˆ์ง€ ์‚ฌ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ž์œ ๋กญ๊ฒŒ ๊ฑด๋„ˆ๊ฐˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ๊ธธ์„ ๊ฑด๋„ˆ์•ผ ํ•œ๋‹ค. ๋†์žฅ์˜ ๋ฐ”๊นฅ์—๋Š” ๋†’์€ ์šธํƒ€๋ฆฌ๊ฐ€ ์žˆ์–ด์„œ ์†Œ๊ฐ€ ๋†์žฅ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐˆ ์ผ์€ ์—†๋‹ค.

K๋งˆ๋ฆฌ์˜ (1 ≤ K ≤ 100,K ≤ N2) ์†Œ๊ฐ€ ์กด์˜ ๋†์žฅ์— ์žˆ๊ณ , ๊ฐ ์†Œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ชฉ์ดˆ์ง€์— ์žˆ๋‹ค. ์–ด๋–ค ๋‘ ์†Œ๋Š” ๊ธธ์„ ๊ฑด๋„ˆ์ง€ ์•Š์œผ๋ฉด ๋งŒ๋‚˜์ง€ ๋ชป ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ์†Œ๊ฐ€ ๋ช‡ ์Œ์ธ์ง€ ์„ธ์–ด๋ณด์ž.

 

โ–ธ ์ž…๋ ฅ

์ฒซ ์ค„์— N, K, R์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ R์ค„์—๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ๊ธธ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ธธ์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋‘ ๋ชฉ์ดˆ์ง€๋ฅผ ์ž‡๊ณ , r c r′ c′์˜ ํ˜•ํƒœ (ํ–‰, ์—ด, ํ–‰, ์—ด)๋กœ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ˆ˜๋Š” 1 ์ด์ƒ N ์ดํ•˜์ด๋‹ค. ๊ทธ ๋‹ค์Œ K์ค„์—๋Š” ํ•œ ์ค„์˜ ํ•˜๋‚˜์”ฉ ์†Œ์˜ ์œ„์น˜๊ฐ€ ํ–‰๊ณผ ์—ด๋กœ ์ฃผ์–ด์ง„๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

๊ธธ์„ ๊ฑด๋„ˆ์ง€ ์•Š์œผ๋ฉด ๋งŒ๋‚  ์ˆ˜ ์—†๋Š” ์†Œ๊ฐ€ ๋ช‡ ์Œ์ธ์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

 

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

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

 

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

์ด ๋ฌธ์ œ๋Š” ์†Œ์˜ ์œ„์น˜์™€ ๋‹ค๋ฆฌ(๊ธธ)์˜ ์œ„์น˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ์•ผ ํ•˜๋Š” ์†Œ๊ฐ€ ๋ช‡ ์Œ์ธ์ง€ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

 

๋ฌธ์ œ ์ดํ•ด๋ฅผ ์œ„ํ•ด ์˜ˆ์ œ ์ž…๋ ฅ 1์„ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณด์ž

๋จผ์ € ์†Œ์™€ ๋‹ค๋ฆฌ๊ฐ€ ์œ„์™€ ๊ฐ™์ด ์œ„์น˜ํ•œ๋‹ค.

๋นจ๊ฐ„์ƒ‰ ์†Œ์™€ ํŒŒ๋ž€์ƒ‰ ์†Œ๋Š” ๋‹ค๋ฆฌ๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  ๋งŒ๋‚  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋นจ๊ฐ„์ƒ‰ ์†Œ์™€ ์ดˆ๋ก์ƒ‰ ์†Œ๊ฐ€ ๋งŒ๋‚˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌด์กฐ๊ฑด ๋‹ค๋ฆฌ๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŒŒ๋ž€์ƒ‰ ์†Œ์™€ ์ดˆ๋ก์ƒ‰ ์†Œ๊ฐ€ ๋งŒ๋‚˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌด์กฐ๊ฑด ๋‹ค๋ฆฌ๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ์•ผ ํ•˜๋Š” ์†Œ๋Š” ๋‘ ์Œ์ด๋‹ค.

 

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ์ง€ ์•Š๊ณ  ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ์Œ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋ฆฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ํ•ด๋‹น ์ขŒํ‘œ๋กœ ์ด๋™ํ•  ๋•Œ, ๋‹ค๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋” ์ด์ƒ ํƒ์ƒ‰์„ ์ด์–ด๊ฐ€์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

๋˜ํ•œ, ์Œ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ž์‹ ๋ณด๋‹ค ์•ž์— ์žˆ๋Š” ์†Œ๋“ค์€ ๊ณ„์‚ฐํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

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

 

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

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

public class Main {
    static int n, k, r;
    static int[][] cow;
    static boolean[][] checked;
    static ArrayList<Pos>[][] road;
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    static public class Pos {
        int x; int y;
        public Pos (int x, int y) {
            this.x = x; this.y = y;
        }
    }
    static int ans;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken()); // n*n
        k = Integer.parseInt(st.nextToken()); // ์†Œ์˜ ์ˆ˜
        r = Integer.parseInt(st.nextToken()); // ๋‹ค๋ฆฌ(๊ธธ)์˜ ์œ„์น˜ ์ •๋ณด

        road = new ArrayList[n][n]; // ๋‹ค๋ฆฌ์— ๋Œ€ํ•œ ์ •๋ณด ์ €์žฅ
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                road[i][j] = new ArrayList<>();
            }
        }
        int a, b, c, d;
        for (int i = 0; i < r; i++) {
            st = new StringTokenizer(br.readLine());
            a = Integer.parseInt(st.nextToken())-1;
            b = Integer.parseInt(st.nextToken())-1;
            c = Integer.parseInt(st.nextToken())-1;
            d = Integer.parseInt(st.nextToken())-1;

            road[a][b].add(new Pos(c, d));
            road[c][d].add(new Pos(a, b));
        }
        
        cow = new int[k][2]; // ์†Œ๊ฐ€ ์žˆ๋Š” ์œ„์น˜
        for (int i = 0; i < k; i++) {
            st = new StringTokenizer(br.readLine());
            a = Integer.parseInt(st.nextToken())-1;
            b = Integer.parseInt(st.nextToken())-1;
            
            cow[i][0] = a;
            cow[i][1] = b;
        }

        // ๊ฒฐ๊ณผ์ ์œผ๋กœ ์Œ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž๊ธฐ๋ณด๋‹ค ๋’ค์— ์žˆ๋Š” ์†Œ๋“ค๋งŒ ๊ณ„์‚ฐํ•˜๋ฉด ๋œ๋‹ค.
        for (int i = 0; i < k; i++) {
            bfs(cow[i][0], cow[i][1], i);
        }

        // ๊ธธ์„ ๊ฑด๋„ˆ์ง€ ์•Š์œผ๋ฉด ๋งŒ๋‚  ์ˆ˜ ์—†๋Š” ์†Œ๊ฐ€ ๋ช‡ ์Œ ?
        System.out.println(ans);
    }

    private static void bfs(int x, int y, int idx) {
        Queue<Pos> que = new LinkedList<>();
        que.offer(new Pos(x, y));

        checked = new boolean[n][n];
        checked[x][y] = true;

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

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

                if (rangeCheck(nx, ny)) continue;

                boolean flag = false; // ๋‹ค๋ฆฌ๊ฐ€ ์žˆ๋Š”์ง€ ์ฒดํฌ
                for (int i = 0; i < road[now.x][now.y].size(); i++) {
                    Pos tmp = road[now.x][now.y].get(i); // ๋‹ค๋ฆฌ ์ •๋ณด

                    if (nx == tmp.x && ny == tmp.y) {
                        flag = true;
                        break;
                    }
                }

                // ๋‹ค๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ํƒ์ƒ‰ X
                if (flag || checked[nx][ny]) continue;

                checked[nx][ny] = true;
                que.offer(new Pos(nx, ny));
            }
        }

        for (int i = idx; i < k; i++) {
            if (!checked[cow[i][0]][cow[i][1]]) ans++;
        }
    }

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

 

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