문제:
어려웠던 부분:
이 문제에서 테스트 케이스의 배열 입력이 한칸씩 띄어서가 아니라 붙어서 입력이 되기 때문에 그런 입력을 받는 방법과 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++;
}
}
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++;
}
}
'Baekjoon' 카테고리의 다른 글
BufferedReader와 StringTokenizer vs Scanner 차이점 (0) | 2024.10.04 |
---|---|
[백준 17413번](자바) StringBuilder의 중요성 (0) | 2024.09.30 |
자바에서 Scanner를 사용할 때 개행 문자와 버퍼의 개념 이해 (1) | 2024.09.26 |
백준 2468번 문제 (자바) (0) | 2023.07.18 |
백준 1748번 문제 [자바] (0) | 2023.07.13 |