Algorithm/백준
백준 2667 (단지번호붙이기)
leecom116
2024. 3. 21. 00:45
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
static int N; // 지도의 크기
static int[][] arr; // 입력 받은 단지
static boolean[][] visited; // 단지 체크
static List<Integer> result; // 단지내 집의 수 모음
static int[] dx = {1, 0, -1, 0};
static int[] dy = {0, 1, 0, -1};
static int each = 0; // 단지내 집의 수
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
N = Integer.parseInt(br.readLine());
arr = new int[N][N];
visited = new boolean[N][N];
result = new ArrayList<>();
for(int j=0; j<N; j++) {
String s = br.readLine();
for(int i=0; i<s.length(); i++) {
arr[j][i] = Character.getNumericValue(s.charAt(i));
}
}
for(int j=0; j<N; j++) {
for(int i=0; i<N; i++) {
// 현재 위치가 1이고, 처음 방문할 경우
if(arr[j][i] == 1 && visited[j][i] == false) {
visited[j][i] = true; // 방문 처리
each = 0; // dfs 돌기전에 단지 초기화
dfs(j, i);
result.add(each);
}
}
}
Collections.sort(result);
bw.write(result.size() + "\n");
for(int r : result) bw.write(r + "\n");
bw.flush();
bw.close();
}
static void dfs(int y, int x) {
for(int k=0; k<4; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
// 다음 좌표가 지도 안에 존재할 경우
if(nx >= 0 && ny >= 0 && nx < N && ny < N) {
// 다음 좌표가 1이고, 첫 방문일 경우
if(arr[ny][nx] == 1 && ! visited[ny][nx]) {
visited[ny][nx] = true; // 방문 처리
dfs(ny, nx); // 재귀 함수 호출
}
}
}
each++; // 현재 단지의 집 +1
}
}
https://www.acmicpc.net/problem/2667
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여
www.acmicpc.net