https://www.acmicpc.net/problem/2667
접근법
DFS나 BFS나 상관없이 가능해보임
1. 지도에서 1인데, 방문하지 않은 지점을 맞이하면
2. 그 Point부터 BFS 혹은 DFS 탐색
3. 방문할때마다 visit 배열 마킹해가며 해당 Point로 시작한 경우 단지의 크기를 count해줌
4. 함수의 return 값을 단지의 크기로 하고, 그 값을 자료구조에 담음
5. 출력할땐 정렬시키고 출력
소스
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int[][] board;
static boolean[][] visit;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
board = new int[n][n];
for(int i = 0; i < n; i++) {
String s = sc.next();
for(int j = 0; j < s.length(); j++) {
int num = Integer.parseInt(s.substring(j, j+1));
board[i][j] = Integer.parseInt(s.substring(j, j+1));
}
}
visit = new boolean[n][n];
ArrayList<Integer> ans = new ArrayList<Integer>();
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(board[i][j] == 1 && !visit[i][j]) {
ans.add(bfs(i, j));
}
}
}
Collections.sort(ans);
System.out.println(ans.size());
for(int value: ans) {
System.out.println(value);
}
}
static int bfs(int x, int y) {
Queue<Point> q = new LinkedList<Point>();
int[][] dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
q.offer(new Point(x, y));
visit[x][y] = true;
int count = 1;
while(!q.isEmpty()) {
Point cur = q.poll();
for(int i = 0; i < dir.length; i++) {
int nextX = cur.x + dir[i][0];
int nextY = cur.y + dir[i][1];
if(nextX < 0 || nextX >= board.length || nextY < 0 || nextY >= board.length) continue;
if(board[nextX][nextY] == 1 && !visit[nextX][nextY]) {
q.offer(new Point(nextX, nextY));
visit[nextX][nextY] = true;
count++;
}
}
}
return count;
}
}
class Point{
int x;
int y;
Point(int x, int y){
this.x = x;
this.y = y;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 - 10026번 적록색약 - java (0) | 2023.07.29 |
---|---|
백준 - 1753번 최단경로 - java (0) | 2023.07.29 |
백준 - 1238번 파티 - java (0) | 2023.07.29 |
백준 - 1260번 DFS와 BFS - java (0) | 2023.07.29 |
백준 - 2805번 나무 자르기 - java (0) | 2023.07.23 |