Baekjoon

백준 2667번 문제 (자바)

kanado 2023. 7. 23. 17:49

문제: 

어려웠던 부분:

이 문제에서 테스트 케이스의 배열 입력이 한칸씩 띄어서가 아니라 붙어서 입력이 되기 때문에 그런 입력을 받는 방법과 DFS함수 안에서 지금 방문하고 있는 위치를  false로 마지막에 바꾸는 경우와 처음에 바꾸는 경우( 마지막에 false로 바뀌게 코드를 작성하면 무한 루프가 발생하는 것을 발견)

 

코드:

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

import java.util.List;

public class Main {
static int N;
static int apartSum = 0;
static int sumOfbild = 0;
static List<Integer> arr = new ArrayList<>();
static int map[][];
static boolean visited[][];
static int dy[] = {-1, 1, 0, 0};
static int dx[] = {0, 0, -1, 1};

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];
visited = new boolean[N][N];

for(int i = 0; i < N; i++){
String str = br.readLine();
for(int j = 0; j < N; j++){
map[i][j] = str.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] = true;
}
}
}

for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
if(visited[i][j] == true){
dfs(i, j);
arr.add(sumOfbild);
sumOfbild = 0;
apartSum++;
}
}
}

arr.sort(null);
System.out.println(apartSum);
for (Integer number : arr) {
System.out.println(number);
}
}

static void dfs(int y, int x){
visited[y][x] = false;
for(int k = 0; k < 4; k++){
int ny = y + dy[k];
int nx = x + dx[k];

if(ny >= 0 && nx >= 0 && ny < N && nx < N && visited[ny][nx] == true){
dfs(ny, nx);

}
}


sumOfbild++;
}

}