백준

백준 1926 그림 (파이썬, 자바)

MC류짱 2022. 12. 18. 17:30

풀이 및 해설(주석) [파이썬]

import sys; from collections import deque


def bfs(r, c, visit):
    Q = deque()
    Q.append((r, c))
    visit.add((r, c))
    tmp_rst = 1
    while Q:
        r, c = Q.popleft()
        for di, dj in [[1, 0], [0, 1], [-1, 0], [0, -1]]:
            nr, nc = r + di, c + dj
            # 범위 체크, 방문 체크, 1인지 체크
            if 0 <= nr < N and 0 <= nc < M and (nr, nc) not in visit and arr[nr][nc] == 1:
                visit.add((nr, nc))
                tmp_rst += 1
                Q.append((nr, nc))
    
    return tmp_rst  # 현재 그림의 영역을 리턴


def main():
    rst = 0
    cnt = 0
    visit = set()
    for i in range(N):
        for j in range(M):
            # 방문하지 않았고, 1이면 bfs탐색
            if (i, j) not in visit and arr[i][j] == 1:
                # bfs함수는 그림의 영역을 리턴하므로 rst갱신
                rst = max(rst, bfs(i, j, visit))
                cnt += 1

    print(cnt)
    print(rst)


if __name__ == '__main__':
    N, M = map(int, sys.stdin.readline().strip().split())
    arr = [list(map(int, sys.stdin.readline().strip().split())) for _ in range(N)]

    main()

 

풀이 [자바]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;


// 백준 1926 그림
public class Main {
    public static int N, M;
    public static int[][] arr;
    public static int rst, cnt;
    public static int[] di = {0, 0, 1, -1};
    public static int[] dj = {1, -1, 0, 0};
    public static int[][] visit;
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String[] nm = bf.readLine().split(" ");
        N = Integer.parseInt(nm[0]);
        M = Integer.parseInt(nm[1]);

        arr = new int[N][M];

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(bf.readLine());
            for (int j = 0; j < M; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        cnt = 0;
        rst = 0;
        visit = new int[N][M];
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (visit[i][j] == 0 && arr[i][j] == 1) {
                    bfs(i, j);
                    cnt += 1;
                }

            }
        }

        System.out.println(cnt);
        System.out.println(rst);

    }
    public static void bfs(int i, int j) {
        Deque<Integer> Q = new ArrayDeque<>();
        // 큐에 넣기
        Q.add(i);
        Q.add(j);
        // 방문처리
        visit[i][j] = 1;
        // 큐가 빌때까지

        int tmpRst = 1;
        while (!Q.isEmpty()) {
            int r = Q.poll();
            int c = Q.poll();
            for (int k = 0; k < 4; k++) {
                int nr = r + di[k];
                int nc = c + dj[k];
                if (nr < 0 || nr >= N || nc < 0 || nc >= M) continue;
                if (visit[nr][nc] == 0 && arr[nr][nc] == 1) {
                    tmpRst += 1;
                    Q.add(nr);
                    Q.add(nc);
                    visit[nr][nc] = 1;
                }
            }
        }
        rst = Math.max(rst, tmpRst);
    }
}