๋ฌธ์
ํด๋น ํฌ์คํ ์ ๋ฐฑ์ค์ 2667๋ฒ ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ ์ ์ ๊ทผ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ๊ธ ์ ๋๋ค.
์ ๋ต ์์ค ์ฝ๋๋ฅผ ํ์ธํ์๋ ค๋ฉด solve url ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๊ทผํด์ผ ํ๋์ง๋ฅผ ๋จผ์ ์๊ฐํด๋ณด์.
๋ฌธ์ ์ ๊ทผ
์ด ๋ฌธ์ ๋ ์ ํ์ ์ธ Connected Component ๋ฌธ์ ์ด๋ค.
๋ค๋ฅธ ๋ง๋ก๋ ์ฐ๊ฒฐ ์์ ์ฐพ๊ธฐ๋ผ๊ณ ํ๋๋ฐ, ํด๋น ๋ฌธ์ ๋ณด๋ค ์กฐ๊ธ ์ฌ์ด ๋ฒ์ ์ด ๋ฐฑ์ค์ 11724๋ฒ ์ฐ๊ฒฐ ์์์ ๊ฐ์ ๋ฌธ์ ์ด๋ค.
์ฐ๊ฒฐ ์์์ ๊ฐ์ ๋ฌธ์ ํ์ด์์ ํด๋น ๋ฌธ์ ์ ์ ๊ทผ๊ณผ ํด๊ฒฐ์ ๋ณผ ์ ์์ผ๋ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๋ฏ ํ๋ค.
ํ์ง๋ง ์ง๋ ์ฐ๊ฒฐ ์์์ ๊ฐ์ ๋ฌธ์ ํ์ด์ ๋ค๋ฅธ ์ ์ด๋ผ๊ณ ํ๋ค๋ฉด, ์ธ์ ๋ฆฌ์คํธ๊ฐ ์๋๋ผ ์ด์ฐจ์ ํ๋ ฌ์ด ๊ทธ๋ํ๊ฐ ๋๋ค๋ ๊ฒ์ด๋ค.
์ธ์ ๋ฆฌ์คํธ๋ ํ๋์ ๋ ธ๋๊ฐ ๋ช ๊ฐ์ ๋ ธ๋๋ฅผ ๊ฐ๋์ง ํ์คํ์ง ์๊ณ , ์ผ๋ง๋ ๊น์ Depth๋ฅผ ๊ฐ๋์ง ํ์คํ์ง ์์ ๋ ์์ฃผ ์ฌ์ฉ๋๋ค.
ํ์ง๋ง ์ด๋ฐ์์ผ๋ก ํ๋ ฌ์ด ๋ ธ๋๊ฐ ๋๋ ๊ฒฝ์ฐ์๋ ํ๋์ ๋ ธ๋๋ ์ต๋ 4๊ฐ์ ์ฐ๊ฒฐ๋๋ค๋ ํน์ง์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ก ์ฌ์ฉํด๋ ๋ฌด๋ฆฌ๊ฐ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๋ฌธ์ ๋ํ ์ฐ๊ฒฐ ์์๋ฅผ ์ฐพ๊ธฐ ์ํด์ dfs ํ์์ ์ด์ฉํ๋ฉด ๋๋ค.
์ค๋ต ํ๋ณด
์ฐ์ ๊ธฐ์ ์ฌ๋ก๊ฐ 2๊ฐ๊ฐ ์์ด์ผ ํ๋ค.
- x, y๊ฐ ๋ฒ์๋ฅผ ๋์ด๊ฐ ๊ฒฝ์ฐ
graph[x][y] == 0
์ฆ ์ง์ด ์๋ ๊ฒฝ์ฐ
๋ ๋ค๋ฅธ ์ค๋ต ํ๋ณด๋, ๋ฌธ์ ์์ ๊ฐ ๋จ์ง์ ์ํ๋ ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.๋ผ๊ณ ๋์๋ค.
๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ๋ ์ ๋ ฌ์ ํ ๋ฒ ์ํํด์ผ ํ๋ค.
์ ๋ต ์ฝ๋
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class Main {
static int[][] graph;
static int count;
static int n;
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());
graph = new int[n][n];
ArrayList<Integer> answer = new ArrayList<>();
for (int i = 0; i < n; i++) {
String[] house = br.readLine().split("");
for (int j = 0; j < n; j++) {
graph[i][j] = Integer.parseInt(house[j]);
}
}
int called = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(dfs(i, j)) {
called++;
answer.add(count);
count = 0;
}
}
}
bw.write(called + "\n");
Collections.sort(answer);
for(int number: answer) bw.write(number + "\n");
bw.flush();
bw.close();
}
private static boolean dfs(int x, int y) {
if(x < 0 || y < 0 || x > n-1 || y > n-1) return false;
if(graph[x][y] == 0) return false;
graph[x][y] = 0;
count++;
dfs(x + 1, y);
dfs(x - 1, y);
dfs(x, y + 1);
dfs(x, y - 1);
return true;
}
}
๋๊ธ