๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[Java] BOJ 1012 ์œ ๊ธฐ๋† ๋ฐฐ์ถ”

by ๐ŸŠ๊ทค๐ŸŠ 2024. 7. 31.

๋ฌธ์ œ 

๋ฌธ์ œ ๋งํฌ https://www.acmicpc.net/problem/1012

  • ์ฐจ์„ธ๋Œ€ ์˜๋†์ธ ํ•œ๋‚˜๋Š” ๊ฐ•์›๋„ ๊ณ ๋žญ์ง€์—์„œ ์œ ๊ธฐ๋† ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.
  • ๋†์•ฝ์„ ์“ฐ์ง€ ์•Š๊ณ  ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๋ ค๋ฉด ๋ฐฐ์ถ”๋ฅผ ํ•ด์ถฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ๋‚˜๋Š” ํ•ด์ถฉ ๋ฐฉ์ง€์— ํšจ๊ณผ์ ์ธ ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๋ฅผ ๊ตฌ์ž…ํ•˜๊ธฐ๋กœ ๊ฒฐ์‹ฌํ•œ๋‹ค.
  • ์ด ์ง€๋ ์ด๋Š” ๋ฐฐ์ถ”๊ทผ์ฒ˜์— ์„œ์‹ํ•˜๋ฉฐ ํ•ด์ถฉ์„ ์žก์•„ ๋จน์Œ์œผ๋กœ์จ ๋ฐฐ์ถ”๋ฅผ ๋ณดํ˜ธํ•œ๋‹ค.
  • ํŠนํžˆ, ์–ด๋–ค ๋ฐฐ์ถ”์— ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•œ ๋งˆ๋ฆฌ๋ผ๋„ ์‚ด๊ณ  ์žˆ์œผ๋ฉด ์ด ์ง€๋ ์ด๋Š” ์ธ์ ‘ํ•œ ๋‹ค๋ฅธ ๋ฐฐ์ถ”๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์–ด, ๊ทธ ๋ฐฐ์ถ”๋“ค ์—ญ์‹œ ํ•ด์ถฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • ํ•œ ๋ฐฐ์ถ”์˜ ์ƒํ•˜์ขŒ์šฐ ๋„ค ๋ฐฉํ–ฅ์— ๋‹ค๋ฅธ ๋ฐฐ์ถ”๊ฐ€ ์œ„์น˜ํ•œ ๊ฒฝ์šฐ์— ์„œ๋กœ ์ธ์ ‘ํ•ด์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
  • ํ•œ๋‚˜๊ฐ€ ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๋Š” ๋•…์€ ๊ณ ๋ฅด์ง€ ๋ชปํ•ด์„œ ๋ฐฐ์ถ”๋ฅผ ๊ตฐ๋ฐ๊ตฐ๋ฐ ์‹ฌ์–ด ๋†“์•˜๋‹ค.
  • ๋ฐฐ์ถ”๋“ค์ด ๋ชจ์—ฌ์žˆ๋Š” ๊ณณ์—๋Š” ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•œ ๋งˆ๋ฆฌ๋งŒ ์žˆ์œผ๋ฉด ๋˜๋ฏ€๋กœ ์„œ๋กœ ์ธ์ ‘ํ•ด์žˆ๋Š” ๋ฐฐ์ถ”๋“ค์ด ๋ช‡ ๊ตฐ๋ฐ์— ํผ์ ธ์žˆ๋Š”์ง€ ์กฐ์‚ฌํ•˜๋ฉด ์ด ๋ช‡ ๋งˆ๋ฆฌ์˜ ์ง€๋ ์ด๊ฐ€ ํ•„์š”ํ•œ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ์ถ”๋ฐญ์ด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉด ์ตœ์†Œ 5๋งˆ๋ฆฌ์˜ ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • 0์€ ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ ธ ์žˆ์ง€ ์•Š์€ ๋•…์ด๊ณ , 1์€ ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ ธ ์žˆ๋Š” ๋•…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    1 1 0 0 0 0 0 0 0 0
    0 1 0 0 0 0 0 0 0 0
    0 0 0 0 1 0 0 0 0 0
    0 0 0 0 1 0 0 0 0 0
    0 0 1 1 0 0 0 1 1 1
    0 0 0 0 1 0 0 1 1 1
  • ์ž…๋ ฅ์˜ ์ฒซ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
  • ๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ์ฒซ์งธ ์ค„์—๋Š” ๋ฐฐ์ถ”๋ฅผ ์‹ฌ์€ ๋ฐฐ์ถ”๋ฐญ์˜ ๊ฐ€๋กœ๊ธธ์ด M(1 ≤ M ≤ 50)๊ณผ ์„ธ๋กœ๊ธธ์ด N(1 ≤ N ≤ 50), ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ ธ ์žˆ๋Š” ์œ„์น˜์˜ ๊ฐœ์ˆ˜ K(1 ≤ K ≤ 2500)์ด ์ฃผ์–ด์ง„๋‹ค.
  • ๊ทธ ๋‹ค์Œ K์ค„์—๋Š” ๋ฐฐ์ถ”์˜ ์œ„์น˜ X(0 ≤ X ≤ M-1), Y(0 ≤ Y ≤ N-1)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
  • ๋‘ ๋ฐฐ์ถ”์˜ ์œ„์น˜๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.
  • ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ์˜ ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด ๋งˆ๋ฆฌ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์•„์ด๋””์–ด

  • boolean ๋ฐฐ์—ด์„ M๊ณผ Nํฌ๊ธฐ๋กœ ์ƒ์„ฑํ•œ๋‹ค.
  • ์ž…๋ ฅ์„ ๋ฐ›์€ ์ขŒํ‘œ๋ฅผ true๋กœ ๋ฐ”๊พผ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ด์ค‘ for๋ฌธ์„ ๋Œ๋ฉด์„œ ํ•ด๋‹น ์ขŒํ‘œ๊ฐ€ true์ผ ๊ฒฝ์šฐ, BFS๋ฅผ ๋Œ๋ฆฐ๋‹ค.
  • BFS๋ฅผ ๋Œ๋ฆด๋•Œ, Point๋ฅผ ์จ์„œ x๊ฐ’๊ณผ y๊ฐ’์„ Queue์— ์ €์žฅํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  while๋ฌธ์„ ๋Œ๋ฆฌ๋Š”๋ฐ Queue๊ฐ€ ๋นŒ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋“ค์— .peek().x์™€ .peek().y๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Queue์— ๋„ฃ์—ˆ๋˜ x์™€ y๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  for๋ฌธ์„ 4๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์œ„์— ์„ ์–ธํ•ด์ฃผ์—ˆ๋˜ ์ƒํ•˜์ขŒ์šฐ ์ขŒํ‘œ๋ฅผ ๊ธฐ์กด ์ขŒํ‘œ๊ฐ’์— ๋”ํ•œ ๊ฐ’์„ ๊ณ„์† ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ์„ ์–ธํ•ด์ค€๋‹ค.
  • ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ์ขŒํ‘œ๊ฐ€ ๊ธฐ์กด ๋ฐฐ์—ด์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด continueํ•˜๊ณ , ๋ฒ”์œ„์•ˆ์ด๋ผ๋ฉด ๋ฐฐ์—ด๊ฐ’์ด true์ธ์ง€ ํ™•์ธํ•œ ๋’ค, ์ด๋™ํ•œ ์ขŒํ‘œ๊ฐ’์„ false๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ  ํ•ด๋‹น ์ขŒํ‘œ๋ฅผ Queue์— ๋„ฃ์–ด์ค€๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  BFS๊ฐ€ ๋Œ๋•Œ๋งˆ๋‹ค ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•œ๋งˆ๋ฆฌ์”ฉ ๋” ํ•„์š”ํ•˜๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ BFS๋Œ๋•Œ๋งˆ๋‹ค ์นด์šดํŠธ๋ฅผ + 1ํ•œ๋‹ค. 

๊ฒช์€ ์‹œํ–‰์ฐฉ์˜ค

  • X

์˜ค๋žœ๋งŒ์˜ BFS.... ๊ธฐ์–ต์„ ๋”๋“ฌ์–ด๊ฐ€๋ฉฐ ์—ด์‹ฌํžˆ ํ’€์—ˆ๋‹ค... ํž˜๋“ค๋‹ค ใ…œใ…œ ์•ž์œผ๋กœ ๋‚˜์—๊ฒŒ ๋‹ฅ์น  ๊ทธ๋ž˜ํ”„ ์‹œ๋ จ๋“ค์ด ๋‘๋ ต๋‹ค ใ…œใ…œ

์ฝ”๋“œ

import java.awt.*;
import java.io.*;
import java.util.*;

public class BOJ1012 {

    static boolean field[][];
    static int dx[] = {-1, 1, 0, 0};
    static int dy[] = {0, 0, -1, 1};

    static int M;

    static int N;

    static int cnt;

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ๊ฐœ์ˆ˜
        int T = Integer.parseInt(br.readLine());

        for(int test = 0; test < T; test++){
            StringTokenizer st = new StringTokenizer(br.readLine());

            // ๋ฐฐ์ถ”๋ฐญ ๊ฐ€๋กœ ๊ธธ์ด
            M = Integer.parseInt(st.nextToken());

            // ๋ฐฐ์ถ”๋ฐญ ์„ธ๋กœ ๊ธธ์ด
            N = Integer.parseInt(st.nextToken());

            // ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ ธ ์žˆ๋Š” ์œ„์น˜์˜ ๊ฐœ์ˆ˜
            int K = Integer.parseInt(st.nextToken());

            field = new boolean[N][M];

            // ์ง€๋ ์ด ๊ฐœ์ˆ˜ ์นด์šดํŠธํ•  ๋ณ€์ˆ˜
            cnt = 0;

            for(int i = 0; i < K; i++){
                StringTokenizer st2 = new StringTokenizer(br.readLine());

                int m = Integer.parseInt(st2.nextToken());
                int n = Integer.parseInt(st2.nextToken());

                // ์ž…๋ ฅ๋ฐ›์€ ์œ„์น˜ ๊ฐ’์„ true๋กœ ๋ณ€ํ™˜ (๋ฐฐ์ถ”๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ)
                field[n][m] = true;
            }

            // ์ขŒํ‘œ๊ฐ’์„ ๋Œ๋ ค๊ฐ€๋ฉฐ ํ•ด๋‹น ์ขŒํ‘œ์— ๋ฐฐ์ถ”๊ฐ€ ์žˆ์œผ๋ฉด
            // BFS๋ฅผ ๋Œ๋ฆผ
            for(int i = 0; i < N; i++){
                for(int j = 0; j < M; j++){
                    if(field[i][j]){
                        BFS(i, j);

                        // BFS๋ฅผ ๋Œ๋ฆฐ ํšŸ์ˆ˜๊ฐ€ ์ง€๋ ์ด ๊ฐœ์ˆ˜์ด๋ฏ€๋กœ ์นด์šดํŠธ + 1
                        cnt = cnt + 1;
                    }
                }
            }

            sb.append(cnt + "\n");
        }

        System.out.println(sb);
    }

    static public void BFS(int i, int j){
        Queue<Point> q = new LinkedList<>();

        // Queue ๊ฐ’์— x,y๊ฐ’์„ ๋„ฃ์–ด์คŒ
        q.offer(new Point(i, j));

        while(!q.isEmpty()){
            // x, y๊ฐ’์„ ๋ณ€์ˆ˜์— ์ €์žฅ
            int nx = q.peek().x;
            int ny = q.peek().y;

            q.poll();

            for(int d = 0; d < 4; d++){
                int mx = nx + dx[d];
                int my = ny + dy[d];

                // ๋งŒ์•ฝ ๋ฐฐ์—ด์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„ค ๊ฒฝ์šฐ, continue
                if(mx >= N || mx < 0 || my >= M || my < 0){
                    continue;
                }

                // ๋งŒ์•ฝ ์ด๋™ํ•œ ์ง€์—ญ์— ๋ฐฐ์ถ”๊ฐ€ ์žˆ๋‹ค๋ฉด
                if(field[mx][my]){
                    // ๊ทธ ์ง€์—ญ ๊ฐ’์„ false๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ 
                    field[mx][my] = false;

                    // ๊ทธ ์ขŒํ‘œ๊ฐ’์„ Queue์— ๋„ฃ์–ด์คŒ
                    q.offer(new Point(mx, my));
                }
            }
        }
    }
}



'์•Œ๊ณ ๋ฆฌ์ฆ˜' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] BOJ 1927 ์ตœ์†Œ ํž™  (0) 2024.08.01
[Java] BOJ 1260 DFS์™€ BFS  (0) 2024.08.01
[Java] BOJ 7626 Four Squares  (2) 2024.07.31
[Java] BOJ 11727 2ร—n ํƒ€์ผ๋ง 2  (0) 2024.07.30
[Java] BOJ 11726 2ร—n ํƒ€์ผ๋ง  (0) 2024.07.29