알고리즘/백준

1926_그림

베리영young 2023. 12. 21. 02:36

사용 알고리즘: bfs

사용 언어: java

 

import java.awt.*;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Scanner;

public class Main_bj_1926_그림 {
    static int n, m;
    static int 최고넓이 = 0;
    static int 그림개수 = 0;
    static int[][] paper;
    static int dx[] = {1,-1,0,0};
    static int dy[] = {0,0,1,-1};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();

        paper = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                paper[i][j] = sc.nextInt();
            }
        }//입력

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                //방문처리 2
                if(paper[i][j]==1){
                    그림개수++;
                    paper[i][j] = 2;
                    bfs(i,j,0); //좌표+넓이
                }
            }
        }

        System.out.println(그림개수);
        System.out.println(최고넓이);
    }

    private static void bfs(int x, int y, int sum) {
        Queue<Point> q = new ArrayDeque<>();
        q.offer(new Point(x, y));

        while (!q.isEmpty()){
            Point p = q.poll();
            sum++;

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

                if(nx>=0 && nx<n && ny>=0 && ny<m &&
                paper[nx][ny]==1){
                    paper[nx][ny] = 2;
                    q.offer(new Point(nx,ny));
                }
            }
        }

        최고넓이 = Math.max(최고넓이, sum);
    }
}

 

 

알고리즘 선택 이유:

구역 나눠서 구역 개수 세기 + 구역 내에서 인접한 행렬 중 유효값 개수 구하기