본문 바로가기
코딩테스트 준비/백준

[백준] 2667번 - 단지번호붙이기 [Java]

by mwzz6 2025. 1. 17.

https://www.acmicpc.net/problem/2667

 

[백준] 2667번 - 단지번호붙이기 [Java]
[백준] 2667번 - 단지번호붙이기 [Java]


1.  아이디어

 

단지를 하나의 그래프로 생각해서 BFS와 DFS를 활용해서 해결했다.


2. 문제풀이

 

입력을 받은 후 2중 for문으로 지도를 순회하며 집을 발견하면 BFS 또는 DFS로 연결된 다른 집을 모두 탐색하며 개수를 세면 단지 하나에 포함된 집의 수를 셀 수 있다. 같은 집을 방문하지 않게 방문 체크를 하며 진행했고, 단지마다 구한 집의 수는 우선순위 큐에 넣어서 정렬한 채로 출력하도록 구현했다.


3. 코드

 

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

public class Main_BFS {

    private static final int[] dr = {-1, 0, 1, 0};
    private static final int[] dc = {0, 1, 0, -1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());

        char[][] map = new char[N][N];
        for (int i = 0; i < N; i++) {
            map[i] = br.readLine().toCharArray();
        }

        boolean[][] visited = new boolean[N][N];

        PriorityQueue<Integer> ans = new PriorityQueue<>();

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (map[i][j] == '0' || visited[i][j]) continue;

                int cnt = bfs(i, j, N, map, visited);
                ans.add(cnt);
            }
        }

        sb.append(ans.size()).append("\n");
        while (!ans.isEmpty()) {
            sb.append(ans.poll()).append("\n");
        }

        bw.write(sb.toString());
        bw.flush();
    }

    private static int bfs(int r, int c, int N, char[][] map, boolean[][] visited) {
        Queue<int[]> q = new ArrayDeque<>();
        q.offer(new int[]{r, c});

        visited[r][c] = true;

        int cnt = 1;

        while (!q.isEmpty()) {
            int[] node = q.poll();

            for (int dir = 0; dir < 4; dir++) {
                int nr = node[0] + dr[dir];
                int nc = node[1] + dc[dir];

                if (nr < 0 || nr >= N || nc < 0 || nc >= N) continue;
                if (map[nr][nc] == '0' || visited[nr][nc]) continue;

                q.offer(new int[]{nr, nc});
                visited[nr][nc] = true;
                cnt++;
            }
        }

        return cnt;
    }

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

public class Main_DFS {

    private static final int[] dr = {-1, 0, 1, 0};
    private static final int[] dc = {0, 1, 0, -1};

    private static int N;
    private static char[][] map;
    private static boolean[][] visited;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        N = Integer.parseInt(br.readLine());

        map = new char[N][N];
        for (int i = 0; i < N; i++) {
            map[i] = br.readLine().toCharArray();
        }

        visited = new boolean[N][N];

        PriorityQueue<Integer> ans = new PriorityQueue<>();

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (map[i][j] == '0' || visited[i][j]) continue;

                int cnt = dfs(i, j);
                ans.add(cnt);
            }
        }

        sb.append(ans.size()).append("\n");
        while (!ans.isEmpty()) {
            sb.append(ans.poll()).append("\n");
        }

        bw.write(sb.toString());
        bw.flush();
    }

    private static int dfs(int r, int c) {
        visited[r][c] = true;
        int cnt = 1;

        for (int dir = 0; dir < 4; dir++) {
            int nr = r + dr[dir];
            int nc = c + dc[dir];

            if (nr < 0 || nr >= N || nc < 0 || nc >= N) continue;
            if (map[nr][nc] == '0' || visited[nr][nc]) continue;

            cnt += dfs(nr, nc);
        }

        return cnt;
    }

}

4. 후기

 

- BFS

- DFS