๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿš€ Algorithm/BOJ

[๋ฐฑ์ค€] 1926 ๊ทธ๋ฆผ(JAVA)

BOJ1926 ๊ทธ๋ฆผ

1926๋ฒˆ: ๊ทธ๋ฆผ

๋ฌธ์ œ

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

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋„ํ™”์ง€์˜ ์„ธ๋กœ ํฌ๊ธฐ n(1 โ‰ค n โ‰ค 500)๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ m(1 โ‰ค m โ‰ค 500)์ด ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ n+1 ์ค„ ๊นŒ์ง€ ๊ทธ๋ฆผ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (๋‹จ ๊ทธ๋ฆผ์˜ ์ •๋ณด๋Š” 0๊ณผ 1์ด ๊ณต๋ฐฑ์„ ๋‘๊ณ  ์ฃผ์–ด์ง€๋ฉฐ, 0์€ ์ƒ‰์น ์ด ์•ˆ๋œ ๋ถ€๋ถ„, 1์€ ์ƒ‰์น ์ด ๋œ ๋ถ€๋ถ„์„ ์˜๋ฏธํ•œ๋‹ค)

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ๊ทธ๋ฆผ์˜ ๊ฐœ์ˆ˜, ๋‘˜์งธ ์ค„์—๋Š” ๊ทธ ์ค‘ ๊ฐ€์žฅ ๋„“์€ ๊ทธ๋ฆผ์˜ ๋„“์ด๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ๋ผ. ๋‹จ, ๊ทธ๋ฆผ์ด ํ•˜๋‚˜๋„ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐ€์žฅ ๋„“์€ ๊ทธ๋ฆผ์˜ ๋„“์ด๋Š” 0์ด๋‹ค.

 

์˜ˆ์ œ ์ž…๋ ฅ

6 5
1 1 0 1 1
0 1 1 0 0
0 0 0 0 0
1 0 1 1 1
0 0 1 1 1
0 0 1 1 1

 

 

๋ฌธ์ œ ํ’€์ด


์š”๊ตฌ ์‚ฌํ•ญ ๋ถ„์„

  • ๋„ํ™”์ง€์˜ ์„ธ๋กœ ํฌ๊ธฐ n๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ m์ด ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค n, m โ‰ค 500)
  • ๋„ํ™”์ง€์— ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ ธ ์žˆ๋‹ค. ๊ทธ๋ฆผ์€ 1๋กœ ์ฑ„์›Œ์ง„ ์˜์—ญ์ด๊ณ , ๋นˆ ๊ณณ์€ 0์œผ๋กœ ์ฑ„์›Œ์ ธ ์žˆ๋‹ค. ๊ทธ๋ฆผ์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒƒ์„ ํ•˜๋‚˜์˜ ๊ทธ๋ฆผ์ด๋ผ๊ณ  ์ •์˜ํ•œ๋‹ค.
  • ๋„ํ™”์ง€์— ์žˆ๋Š” ๊ทธ๋ฆผ์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ€์žฅ ๋„“์€ ๊ทธ๋ฆผ์˜ ๋„“์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์‹œ๊ฐ„ ๋ณต์žก๋„

  • BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ฐ ์ •์ ์„ ํ•œ ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ•˜๋ฏ€๋กœ O(V)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค. (์—ฌ๊ธฐ์„œ V๋Š” ์ •์ ์˜ ๊ฐœ์ˆ˜)
  • ์ •์  : ๋„ํ™”์ง€์˜ ๊ฐ ์นธ
    • ์ตœ๋Œ€ 500 x 500 = 25๋งŒ๊ฐœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(250000) = O(10^5)๊ฐ€ ๋œ๋‹ค.

 

ํ’€์ด

package com.ll.level1.boj;

import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;

// ํ–‰๊ณผ ์—ด์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ ์ขŒํ‘œ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Coord ํด๋ž˜์Šค ์ •์˜
class Coord {
    // ํ–‰๊ณผ ์—ด์„ ์ €์žฅํ•  ํ•„๋“œ ์„ ์–ธ
    int x;
    int y;

    // ์ƒ์„ฑ์ž ์ •์˜ (๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ–‰๊ณผ ์—ด์„ ๋ฐ›์•„ ํ•„๋“œ์— ์ €์žฅ)
    public Coord(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public class boj1926 {
    // ์ƒํ•˜์ขŒ์šฐ ์ด๋™์„ ์œ„ํ•œ ๋ฐฐ์—ด์„ ์ •์˜
    static int[] dx = {0, 0, -1, 1}; // ์—ด์˜ ๋ณ€ํ™”๋Ÿ‰
    static int[] dy = {-1, 1, 0, 0}; // ํ–‰์˜ ๋ณ€ํ™”๋Ÿ‰

    // BFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ (๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ํ™”์ง€์˜ ์ •๋ณด์ธ ๋ฐฐ์—ด arr๊ณผ ์‹œ์ž‘์ ์˜ ํ–‰๊ณผ ์—ด์„ ๋ฐ›์Œ)
    static int bfs(int[][] arr, int x, int y) {
        // ํ ์ƒ์„ฑ (ํ–‰๊ณผ ์—ด์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ ์ขŒํ‘œ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐ)
        Queue<Coord> queue = new LinkedList<>();
        // ์‹œ์ž‘์ ์„ ํ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ’์„ 0์œผ๋กœ ๋ณ€๊ฒฝ
        queue.add(new Coord(x, y));
        arr[x][y] = 0;
        // ์—ฐ๊ฒฐ๋œ ์ƒ‰์น ๋œ ๋ถ€๋ถ„์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ฆ (์ดˆ๊ธฐ๊ฐ’์€ 1 (์‹œ์ž‘์  ํฌํ•จ))
        int count = 1;
        // ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        while (!queue.isEmpty()) {
            // ํ์—์„œ ํ•˜๋‚˜์˜ ์ขŒํ‘œ ๊ฐ์ฒด๋ฅผ ๊บผ๋ƒ„
            Coord coord = queue.poll();
            // ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋ณต๋ฌธ์„ ๋ˆ๋‹ค.
            for (int i = 0; i < 4; i++) {
                // ํ˜„์žฌ ์ขŒํ‘œ์—์„œ ์ด๋™ํ•  ์ขŒํ‘œ ๊ณ„์‚ฐ
                int nx = coord.x + dx[i];
                int ny = coord.y + dy[i];
                // ์ด๋™ํ•  ์ขŒํ‘œ๊ฐ€ ๋„ํ™”์ง€ ๋ฒ”์œ„ ์•ˆ์— ์žˆ๊ณ  ์ƒ‰์น ๋œ ๋ถ€๋ถ„์ด๋ผ๋ฉด
                if (nx >= 0 && nx < arr.length && ny >= 0 && ny < arr[0].length && arr[nx][ny] == 1) {
                    // ๊ทธ ์ขŒํ‘œ๋ฅผ ํ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ’์„ 0์œผ๋กœ ๋ณ€๊ฒฝ
                    queue.add(new Coord(nx, ny));
                    arr[nx][ny] = 0;
                    // ์—ฐ๊ฒฐ๋œ ์ƒ‰์น ๋œ ๋ถ€๋ถ„์˜ ๊ฐœ์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œํ‚ด
                    count++;
                }
            }
        }
        // ์ตœ์ข…์ ์œผ๋กœ ๊ตฌํ•œ ์—ฐ๊ฒฐ๋œ ์ƒ‰์น ๋œ ๋ถ€๋ถ„์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ด
        return count;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // ๋„ํ™”์ง€์˜ ์„ธ๋กœ ํฌ๊ธฐ n๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ m์„ ์ž…๋ ฅ๋ฐ›์Œ
        int n = sc.nextInt();
        int m = sc.nextInt();

        // ๋„ํ™”์ง€ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐˆ n x m ํฌ๊ธฐ์˜ ๋ฐฐ์—ด ์ƒ์„ฑ
        int[][] arr = new int[n][m];

        // ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ n+1 ์ค„๊นŒ์ง€ ๊ทธ๋ฆผ ์ •๋ณด(0๊ณผ 1)์„ ์ž…๋ ฅ๋ฐ›์•„ ๋ฐฐ์—ด์— ์ €์žฅ
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                arr[i][j] = sc.nextInt();
            }
        }

        // ๊ทธ๋ฆผ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜ (์ดˆ๊ธฐ๊ฐ’ 0)
        int picture = 0;
        // ๊ทธ๋ฆผ์˜ ์ตœ๋Œ€ ๋„“์ด๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜ (์ดˆ๊ธฐ๊ฐ’ 0)
        int maxArea = 0;

        // ๋„ํ™”์ง€ ์ „์ฒด๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ๋ˆ๋‹ค.
        for (int i=0; i<n; i++) {
            for (int j=0; j<m; j++) {
                // ์ƒ‰์น ๋œ ๋ถ€๋ถ„์ด๋ผ๋ฉด
                if (arr[i][j] == 1) {
                    // ๊ทธ๋ฆผ์˜ ๊ฐœ์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œํ‚ด
                    picture++;
                    // ์—ฐ๊ฒฐ๋œ ์ƒ‰์น ๋œ ๋ถ€๋ถ„์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ  ์ตœ๋Œ€ ๋„“์ด์™€ ๋น„๊ตํ•˜์—ฌ ๊ฐฑ์‹ 
                    maxArea = Math.max(maxArea, bfs(arr,i,j));
                }
            }
        }

        System.out.println(picture); // ๊ทธ๋ฆผ์˜ ๊ฐœ์ˆ˜
        System.out.println(maxArea); // ์ตœ๋Œ€ ๋„“์ด

        sc.close();

    }
}

 

'๐Ÿš€ Algorithm > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€