https://www.acmicpc.net/problem/2667
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
'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준] 13459번 - 구슬 탈출 [Java] (0) | 2025.01.17 |
---|---|
[백준] 1926번 - 그림 [Java] (0) | 2025.01.17 |
[백준] 2606번 - 바이러스 [Java] (0) | 2025.01.17 |
[백준] 7562번 - 나이트의 이동 [Java] (0) | 2025.01.17 |
[백준] 1260번 - DFS와 BFS [Java] (0) | 2025.01.17 |