[BOJ]단지번호붙이기-2667(BFS/DFS)

한상희·2025년 3월 1일
post-thumbnail
package dfs.Day250301;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Day01_단지번호붙이기_re {

    static int n;
    static int cnt = 1;
    static int[][] square;
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    static boolean[][] visited;
    static List<Integer> result;


    public static void solution(int[][] square) {
        result = new ArrayList<>();
        visited = new boolean[n][n];

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (square[i][j] == 1 && !visited[i][j]) {
                    dfs(i, j);
                    result.add(cnt);
                    cnt = 1;
                }
            }
        }

    }

    public static void dfs(int x, int y) {
        visited[x][y] = true;

        for (int i = 0; i < 4; i++) {
            int xx = dx[i] + x;
            int yy = dy[i] + y;

            if (xx >= 0 && yy >= 0 && xx < n && yy < n && !visited[xx][yy] && square[xx][yy] == 1) {
                dfs(xx, yy);
                cnt++;
            }
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());

        square = new int[n][n];

        for (int i = 0; i < n; i++) {
            String s = br.readLine();
            for (int j = 0; j < n; j++) {
                square[i][j] = s.charAt(j) - '0';
            }
        }

        solution(square);

        System.out.println(result.size());
        Collections.sort(result);
        for (int i : result) {
            System.out.println(i);
        }

    }
}

문제


그림을 보면 0은 집이 없는 곳 1은 집이 있는 곳입니다.
그리고 집이 여러개가 연결되어있으면 단지로 구별하고 이 단지가 총 몇단지인지 몇개의 단지가 있는지 출력하는 문제입니다.

정사각형으로 5≤N≤25 입력값이 주어지고 시간제한은 1초입니다.

조건

출력값은 오름차순으로 해야되기 때문에 정렬을 한번 해줘야 합니다.

결과

30~40분이 지나서 해결하지 못해서 다른 사람의 코드를 참고 했습니다.

profile
안녕하세요

0개의 댓글