https://www.acmicpc.net/problem/2667
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여
www.acmicpc.net
해석 및 팁
이 문제는 bfs를 사용하면 되는 문제입니다. 단지수를 세어주고 정렬하여 출력하면 됩니다.
Java 코드
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
public class Main {
static int n;
static int count;
static int[][] arr;
static boolean[][] visit;
static int[] dx = {1, -1, 0, 0};
static int[] dy = {0, 0, -1, 1};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
ArrayList<Integer> list = new ArrayList<>();
n = sc.nextInt();
arr = new int[n][n];
visit = new boolean[n][n];
for(int i = 0; i < n; i++) {
String s = sc.next();
for(int j = 0; j < n; j++) {
arr[i][j] = s.charAt(j) - '0';
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(arr[i][j] != 0 && visit[i][j] == false) {
count = 0;
dfs(i, j);
list.add(count);
}
}
}
Collections.sort(list);
sb.append(list.size()+"\n");
for(int i = 0; i < list.size(); i++) sb.append(list.get(i)+"\n");
System.out.println(sb);
}
public static void dfs(int a, int b) {
visit[a][b] = true;
count++;
for(int i = 0; i < 4; i++) {
int x = a + dx[i];
int y = b + dy[i];
if(x >= 0 && x < n && y >= 0 && y < n) {
if(arr[x][y] != 0 && visit[x][y] == false) dfs(x, y);
}
}
}
}
'백준' 카테고리의 다른 글
백준 1931 회의실배정(Java) (0) | 2023.02.14 |
---|---|
백준 1149 RGB거리(Java) (0) | 2023.02.13 |
백준 1500 최대 곱(Java) (0) | 2023.02.12 |
백준 1254 팰린드롬 만들기(Java) (0) | 2023.02.12 |
백준 6588 골드바흐의 추측(Java) (0) | 2023.02.12 |