https://softeer.ai/practice/info.do?idx=1&eid=409&sw_prbl_sbms_sn=139968
import java.util.*;
import java.io.*;
class Position{
int x;
int y;
Position(int x, int y){
this.x = x;
this.y = y;
}
}
public class Main
{
static int N;
static int[][] map;
static int answer;
static Queue<Position> queue;
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,-1,1};
static ArrayList<Integer> blocks;
static void count(int x, int y){
queue.add(new Position(x,y));
map[x][y]=2;
int cnt=1;
while(!queue.isEmpty()){
Position tmp = queue.poll();
for(int i=0;i<4;i++){
int nx = tmp.x+dx[i];
int ny = tmp.y+dy[i];
if(isIn(nx,ny)&&map[nx][ny]==1){
queue.add(new Position(nx,ny));
cnt++;
map[nx][ny]=2; //방문처리
}
}
}
//queue가 비었으면 장애물 하나 끝
answer++;
blocks.add(cnt);
}
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());
map = new int[N][N];
queue = new LinkedList<>();
blocks = new ArrayList<>();
answer = 0;
for(int i=0;i<N;i++){
String tmp = br.readLine();
for(int j=0;j<N;j++){
map[i][j] = Character.getNumericValue(tmp.charAt(j));
}
}
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(map[i][j]==1){
count(i,j);
}
}
}
//장애물 블록수, 블록에 속하는 장애물의 수 오름차순 정렬 출력
System.out.println(answer);
int[] answerList = new int[answer];
for(int i=0;i<answer;i++){
answerList[i] = blocks.get(i);
}
Arrays.sort(answerList);
for(int x:answerList){
System.out.println(x);
}
}
}
백준에 단지번호 붙이기랑 같은 문제인듯하다. 단지번호 붙이기는 실버 1!
'알고리즘' 카테고리의 다른 글
[BOJ] 22233번 : 가희와 키워드 (JAVA) (0) | 2023.02.04 |
---|---|
[BOJ] 15663번 : N과 M (9) (JAVA) (0) | 2023.02.03 |
[BOJ] 14503번: 로봇 청소기 (JAVA) (0) | 2023.01.30 |
[BOJ] 9205번: 맥주 마시면서 걸어가기 (JAVA) (0) | 2023.01.27 |
[BOJ] 1260번 : DFS와 BFS (JAVA) (0) | 2023.01.26 |