๋ฌธ์
ํด๋น ํฌ์คํ ์ ๋ฐฑ์ค์ 4963๋ฒ ์ฌ์ ๊ฐ์ ์ ์ ๊ทผ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ๊ธ ์ ๋๋ค.
์ ๋ต ์์ค ์ฝ๋๋ฅผ ํ์ธํ์๋ ค๋ฉด solve url ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๊ทผํด์ผ ํ๋์ง๋ฅผ ๋จผ์ ์๊ฐํด๋ณด์.
๋ฌธ์ ์ ๊ทผ
์ด ๋ฌธ์ ๋ ์ ํ์ ์ธ Connected Component ๋ฌธ์ ์ด๋ค.
๋ค๋ฅธ ๋ง๋ก๋ ์ฐ๊ฒฐ ์์ ์ฐพ๊ธฐ๋ผ๊ณ ํ๋๋ฐ, ํด๋น ๋ฌธ์ ๋ณด๋ค ์กฐ๊ธ ์ฌ์ด ๋ฒ์ ์ด ๋ฐฑ์ค์ 11724๋ฒ ์ฐ๊ฒฐ ์์์ ๊ฐ์ ๋ฌธ์ ์ด๋ค.
์ฐ๊ฒฐ ์์์ ๊ฐ์ ๋ฌธ์ ํ์ด์์ ํด๋น ๋ฌธ์ ์ ์ ๊ทผ๊ณผ ํด๊ฒฐ์ ๋ณผ ์ ์์ผ๋ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๋ฏ ํ๋ค.
์ด๋ฒ ๋ฌธ์ ์์๋ ํ์ฌ ํ์ํ๋ ๋ ธ๋์์ ์ํ์ข์ฐ + ๋๊ฐ์ 4์ข ๋ฅ ๋ชจ๋ ๊ณ ๋ คํด์ผ ํ๋ ๋ฌธ์ ์ด๋ค.
ํด๊ฒฐ๋ฒ
์ํ์ข์ฐ, 4๋๊ฐ์ ์ ํ์ํ๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ด dfs๋ฅผ ์ฌ๊ทํธ์ถํ ์ ์๋ค.
static boolean dfs(int x, int y) {
if(x == -1 || y == -1 || x == n || y == m) return false;
if(graph[x][y] == 0) return false;
graph[x][y] = 0;
dfs(x, y + 1);
dfs(x, y - 1);
dfs(x - 1, y);
dfs(x - 1, y - 1);
dfs(x - 1, y + 1);
dfs(x + 1, y);
dfs(x + 1, y - 1);
dfs(x + 1, y + 1);
return true;
}
์ด๋ ๊ฒ ํ๋ฉด 8๋ฐฉํฅ ๋ชจ๋ ํธ์ถ์ด ๋๋๋ฐ, ์ด๋ ๊ฒ ๋๋ค๋ฉด ์ค๋ณต์ด ๋ง์ด ๋ฐ์ํด์ ๋ณด๊ธฐ๊ฐ ์ ์ข๋ค.
์ด๋ฐ ์ํฉ์์ ์ ์ฉํ๊ฒ ์ฐ์ด๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋๋ฐ, ๊ฐ๊ฐ ๋๊ฐ์ ๊ณผ ์ํ์ข์ฐ ์์น๋ฅผ ๋ฐฐ์ด๋ก ์ ์ฅํ๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
static int[] dx = {0, 0, 1, 1, 1, -1, -1, -1};
static int[] dy = {1, -1, 0, -1, 1, -1, 0, 1};
static boolean dfs(int x, int y) {
if(x == -1 || y == -1 || x == n || y == m) return false;
if(graph[x][y] == 0) return false;
graph[x][y] = 0;
for (int i = 0; i < dx.length; i++) {
int xx = dx[i];
int yy = dy[i];
dfs(x + xx, y + yy);
}
return true;
}
์ ๋ต ์ฝ๋
import java.io.*;
public class Main {
static int n;
static int m;
static int[][] graph;
static int[] dx = {0, 0, 1, 1, 1, -1, -1, -1};
static int[] dy = {1, -1, 0, -1, 1, -1, 0, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
while(true) {
String[] nm = br.readLine().split(" ");
n = Integer.parseInt(nm[1]);
m = Integer.parseInt(nm[0]);
if(n == 0 && m == 0) break;
graph = new int[n][m];
for (int i = 0; i < n; i++) {
String[] map = br.readLine().split(" ");
for (int j = 0; j < map.length; j++) {
graph[i][j] = Integer.parseInt(map[j]);
}
}
int count = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if(dfs(i, j)) count++;
}
}
bw.write(count + "\n");
}
bw.flush();
bw.close();
}
static boolean dfs(int x, int y) {
if(x == -1 || y == -1 || x == n || y == m) return false;
if(graph[x][y] == 0) return false;
graph[x][y] = 0;
for (int i = 0; i < dx.length; i++) {
int xx = dx[i];
int yy = dy[i];
dfs(x + xx, y + yy);
}
return true;
}
}
๋ฌธ์ ํ๊ณ
์ด๋ฒ ๋ฌธ์ ๋ BFS๋ก ํ์ง ๋ชปํ ๋ฌธ์ ์ด๋ค.
n, m์ด ๊ฐ์ ์ ์ผ ๋๋ ๋์์ ํ์ง๋ง n, m์ด ์๋ก ๋ค๋ฅธ ์๋ผ๋ฉด loop๋ฅผ ๋น ์ ธ๋๊ฐ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ์ฌ๋ฌ ๋ ธ๋ ฅ์ ํ์์ผ๋ ์ค์ผ์ค๋ก ์ธํด ๊ฒฐ๊ตญ ํด๊ฒฐํ์ง ๋ชปํ ๋ฌธ์ ์๋ค.
WBS์ ์ฒดํฌ ํด๋๊ณ ๋ค์์ ๋ค์ ํ์ด๋ด์ผ๊ฒ ๋ค.
๋๊ธ