백준

백준 14716 현수막 (자바)

MC류짱 2023. 1. 16. 21:59

풀이

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

public class Main {
    public static int N, M;
    public static int cnt = 0;
    public static int[][] arr;
    public static boolean[][] visited;
    public static Deque<int[]> Q = new ArrayDeque<>();
    public static int[] di = {1, 0, -1, 0, -1, -1, 1, 1};
    public static int[] dj = {0, 1, 0, -1, -1, 1, -1, 1};
    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());
            }
        }
        visited = new boolean[N][M];
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (arr[i][j] == 1 && !visited[i][j]) {
                    Q.add(new int[]{i, j});
                    bfs();
                    cnt ++;
                }
            }
        }
        System.out.println(cnt);
    }
    public static void bfs() {
        while (!Q.isEmpty()) {
            int[] now = Q.poll();
            int r = now[0];
            int c = now[1];
            visited[r][c] = true;
            for (int i = 0; i < 8; i++) {
                int nr = r + di[i];
                int nc = c + dj[i];
                if (nr < 0 || nr >= N || nc < 0 || nc >= M || arr[nr][nc] == 0 || visited[nr][nc]) continue;
                Q.add(new int[]{nr, nc});
                visited[nr][nc] = true;
            }
        }
    }
}

 

후기

  • 간단한 그래프 탐색 문제여서 자바로 풀어봤는데 자바 문법을 많이 까먹었다.
  • dfs나 bfs을 할 줄 아면 풀 수 있는 문제이다.