https://www.acmicpc.net/problem/2667
import java.io.*;
import java.util.*;
class Point{
int x;
int y;
Point(int x, int y){
this.x = x;
this.y = y;
}
}
public class hy {
static int N;
static int[][] map;
static boolean[][] visited;
static ArrayList<Integer> house = new ArrayList<>();
static int houseCnt;
static Queue<Point> queue = new LinkedList<>();
static int[] dx = { 0,0,-1,1};
static int[] dy = {1,-1,0,0};
static void bfs(int x, int y){
houseCnt++; //집의 수
visited[x][y]=true;
queue.add(new Point(x,y));
while(!queue.isEmpty()){
Point cur = queue.poll();
for(int i=0;i<4;i++) {
int nx = cur.x + dx[i];
int ny = cur.y + dy[i];
if (isIn(nx,ny)&&map[nx][ny] == 1 && !visited[nx][ny]) {
bfs(nx, ny);
}
}
}
}
static boolean isIn(int x, int y){
if(x<0||x>=N||y<0||y>=N) return false;
return true;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
houseCnt = 0;
map = new int[N][N];
visited = new boolean[N][N];
for(int i=0;i<N;i++){
String tmp = br.readLine();
for(int j=0;j<N;j++) {
map[i][j] = tmp.charAt(j)-'0';
}
}
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(map[i][j]==1&&!visited[i][j]) {
bfs(i, j);
house.add(houseCnt); //단지 다 센거니까 집 수 넣기
houseCnt = 0;
}
}
}
int[] answer = new int[house.size()];
for(int i=0;i<house.size();i++){
answer[i]=house.get(i);
}
Arrays.sort(answer);
System.out.println(answer.length);
for(int x:answer){
System.out.println(x);
}
}
}
처음으로 내 힘으로 푼 bfs 문제이다 !! 더 깔끔한 코드를 짤 수 있었겠지만,, 혼자 힘으로 빠르게 풀었다는 것에 의의를 두겠다 ! ㅎㅎ
단지 수를 셀 때 arrayList를 쓰는게 좋을지, N*N개의 배열을 선언해 놓는게 좋을지 궁금하다.
'알고리즘' 카테고리의 다른 글
[BOJ] 1260번 : DFS와 BFS (JAVA) (0) | 2023.01.26 |
---|---|
[BOJ] 1697번 : 숨바꼭질 (JAVA) (0) | 2023.01.25 |
[BOJ] 4889번 : 안정적인 문자열 (JAVA) (0) | 2023.01.20 |
[BOJ] 4358번 : 생태학 (JAVA) (0) | 2023.01.19 |
[BOJ] 4659번 : 비밀번호 발음하기 (JAVA) (0) | 2023.01.18 |