์ด์ ์ด ๋ฌธ์ ๋๋ฌธ์ ํ๋ฃจ๋ฅผ ํต์ผ๋ก ๋ ๋ ธ๋ค...
๊ณ ๋ฏผ์ ๊ทธ๋งํผ ๋ง์ด ํ๋ ๋ฌธ์ , ํด๊ฒฐ์ ์ํ ์์ด๋์ด ์์ฒด๋ ๊ฐ๋จํ๊ฒ ๋ ์ฌ๋๋๋ฐ, ์ด๋ฅผ ๊ตฌํํ๋๋ฐ ๊ต์ฅํ ์ค๋ ๊ฑธ๋ ธ๋ค.
1. ์ฌ๋ง๋ค, ๊ฐ์ ์ก์ง๋ ๋ฒํธ๋ฅผ ๋ถ์ฌํด์ Labeling์ ํ๋ค.
2. boolean ๋งต์ ๋ง๋ค์ด์, ์ก์ง ๋ถ๋ถ์ True๋ก ๋ง๋ค์ด ๋๋๋ค.
3. ์ฌ๋ง๋ค bfs๋ฅผ ์คํํด์, ๋ค๋ฅธ ์ฌ๊ณผ ๋ง๋๋ ์๊ฐ, ๊ธธ์ด๋ฅผ ๊ธฐ๋กํ๊ณ , ๊ฐ์ฅ ์ต์๊ฐ์ ๋จ๊ธด๋ค.
๋จผ์ ์ ์ฒด ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class No_2146 {
static int N, min = Integer.MAX_VALUE;
static int land = 1;
static int[][] map;
static boolean[][] marked;
static int[] dx = {1, -1, 0, 0};
static int[] dy = {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];
marked = new boolean[N][N];
//๋งต์ ๋ค ์
๋ ฅํ๋ค.
for (int i = 0; i < N; i++) {
String[] input = br.readLine().split(" ");
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(input[j]);
}
}
//๊ฐ์ ์ฌ์ ์ก์ง์ ๋ผ๋ฒจ๋ง์ ํ๋ค.
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
//๋ฐ๋ค์ธ ๊ฒฝ์ฐ? + ์ด๋ฏธ ๋ฐฉ๋ฌธํ๋ ์ก์ง์ธ ๊ฒฝ์ฐ? PASS
if (map[i][j] == 0 || marked[i][j] == true) {
continue;
}
//๋ฐฉ๋ฌธํ์ง ์์๋ ์ก์ง๋ฅผ ๋ฐ๊ฒฌํ ๊ฒฝ์ฐ? dfs ์คํ
dfs(i, j);
//dfs๊ฐ ๋๋๋ฉด, ๋ผ๋ฒจ๋งํ land์ ๊ฐ์ ํ๋ ์ฆ๊ฐ ์ํจ๋ค.
land++;
}
}
//๋ฐฉ๋ฌธ๊ธฐ๋ก์ ์ด๊ธฐํํ๋ค. ๋จ๊ฒจ๋ ์ด์ ๊ฐ ์๋ค. ์ด์ ๋ฐฉ๋ฌธ ๊ธฐ๋ก์ dfs๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ค์ด๋ ๊ฒ์ผ ๋ฟ bfs๋ฅผ ๋ค์
//์๋์์ผ์ผ ํ๊ธฐ ๋๋ฌธ์, ์ฌํ์ฉํ๋ ๊ฒ
marked = new boolean[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
//๋ฐ๋ค์ธ ๊ฒฝ์ฐ? PASS
if (map[i][j] == 0 ){
continue;
}
//์ฒ์ ๋ฐฉ๋ฌธํ ์ก์ง๊ฐ ๋์ค๋ ๊ฒฝ์ฐ? bfs ์คํ
bfs(i, j, map[i][j]);
}
}
System.out.println(min);
}
static void dfs(int x, int y) {
//์ก์ง์ด๋ฉด์ (map[x][y]==1) ๋ฐฉ๋ฌธ ๊ธฐ๋ก์ด ์๋ ๊ณณ์ผ ๋
if (marked[x][y] == false && map[x][y] == 1) {
//๋ฐฉ๋ฌธ ๊ธฐ๋ก์ ๋จ๊ธด๋ค.
marked[x][y] = true;
//๋ฐฉ๋ฌธ๊ธฐ๋ก์ ๋จ๊ธฐ๋ฉด์, land ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
map[x][y] = land;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
//์ด๋ํ๋ฉด์ ๋งต ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๊ฑฐ๋, ๋ฐฉ๋ฌธํ์ง ์์ ์ก์ง์ธ ๊ฒฝ์ฐ dfs๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
if (((0 <= nx && nx < N) && (0 <= ny && ny < N)) && marked[nx][ny] == false && map[nx][ny] == 1) {
dfs(nx, ny);
}
}
}
}
static void bfs(int x, int y, int land) {
//bfs๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ Queue
Queue<int[]> q = new LinkedList<>();
//bfs๋ฅผ ์ํด ํ์ ํด๋น ์ขํ๋ฅผ ๋ฃ๋๋ค.
// x์ขํ y์ขํ ๋ค๋ฆฌ๊ธธ์ด(๊ธฐ๋ณธ๊ฐ์ 0์ด๋ค, ๋ฐ๋ค๋ฅผ ๋ง๋๋ฉด 1์ฉ ์ฆ๊ฐ์ํจ๋ค.)
q.offer(new int[]{x, y, 0});
//๋ฐฉ๋ฌธํ๋ ๋ฐ๋ค์ธ์ง ์ฒดํฌํ๊ธฐ ์ํด ๋ฐฐ์ด ์ด๊ธฐํ
boolean[][] marked = new boolean[N][N];
//ํ๊ฐ ์์ ํ ๋น ๋๊น์ง ์งํ
while (!q.isEmpty()) {
int[] point = q.poll();
for (int k = 0; k < 4; k++) {
//ํ์ ๋ฃ์๋ ํฌ์ธํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์,ํ,์ข,์ฐ ํ์
int nx = point[0] + dx[k];
int ny = point[1] + dy[k];
//๋งต ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ, PASS
if (nx < 0 || ny < 0 || nx >= N || ny >= N) {
continue;
}
//๊ฐ์ ์ฌ์ผ ๊ฒฝ์ฐ, ๋ค๋ฆฌ๋ฅผ ๋์ ์ ์์ผ๋ฏ๋ก ๋ฐฉ๋ฌธ ํ์๋ง ํ๊ณ ๋์ด๊ฐ๋ค.
if (map[nx][ny] == land) {
continue;
}
//๋ฐฉ๋ฌธํ๋ ๋ฐ๋ค์ธ ๊ฒฝ์ฐ ๋์ด๊ฐ๋ค.
if (marked[nx][ny] == true) {
continue;
}
// ํฌ์ธํธ๊ฐ 0์ด๊ณ , ๋ฐฉ๋ฌธํ์ง ์์ ๋ฐ๋ค๋ผ๋ฉด?
if (map[nx][ny] == 0) {
//ํ์ ์ถ๊ฐํด์ค ๋ค, ๋ค๋ฆฌ ๊ธธ์ด๋ฅผ 1์นธ ๋๋ฆฐ๋ค.
// ๋ฐ๋ค ๋ฐฉ๋ฌธ ํ์๋ฅผ ๋จ๊ธด๋ค.
q.offer(new int[]{nx, ny, point[2] + 1});
marked[nx][ny] = true;
//๋ค๋ฅธ ์ฌ์ ๋์ฐฉํ๋ค๋ฉด? ๋์ด์ ํ์์ ํ์ง ์์๋ ๋๋ค.
} else if (map[nx][ny] != land) {
//๋ค๋ฆฌ ๊ธธ์ด๋ฅผ ๋๋ฆฌ์ง ์๊ณ , ์ต์๊ฐ์ ํ์ธํ๋ค.
min = Math.min(min, point[2]);
return;
}
}
}
}
}
1. ๋ฉ์ธ ๋ฉ์๋
๋จผ์ , ๋ฉ์ธ ๋ฉ์๋๋ ์ ๋ ฅ๋ฐ๋ ๊ฒ๋ถํฐ ์์ํ๋ค.
BufferedReader๋ฅผ ์ฌ์ฉํด์ N์ ์ ๋ ฅ๋ฐ๊ณ , N*N ํฌ๊ธฐ์ ๋งต์ ๋ง๋ ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ค for ๋ฌธ์ ์ฌ์ฉํด์, ์ ๋ ฅ์ผ๋ก ๋ค์ด์ค๋ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ๋งต์ ์ ๋ ฅํ๋ค.
land ๋ผ๋ ๋ณ์๋ฅผ ์ด์ฉํด์, dfsํ์๋, ์ฒ์ ๋ฐ๊ฒฌ๋๋ ์ฌ์ land = 1 ๊ฐ์ผ๋ก ์ญ ๋ผ๋ฒจ๋งํ๊ณ ,
๋ค์ dfs ๋๋ land =2 ๋ก ๋ผ๋ฒจ๋งํ๊ณ ... ์ด๋ฐ์์ผ๋ก ๋ฒํธ๋ฅผ ๋ถ์ฌํ ๊ฒ์ด๋ค.
๊ทธ ๋ค์, bfs๋ฅผ ์ฌ์ฉํด์, ์ต๋จ ๊ฑฐ๊ธฐ๋ฅผ ์ฐพ์ ๊ฒ์ด๋ค.
2. ์ฌ๋ง๋ค ๋ฒํธ๋ฅผ ๋ถ์ฌํด์ ๋ผ๋ฒจ๋ง ํ๊ธฐ
static void dfs(int x, int y) {
//์ก์ง์ด๋ฉด์ (map[x][y]==1) ๋ฐฉ๋ฌธ ๊ธฐ๋ก์ด ์๋ ๊ณณ์ผ ๋
if (marked[x][y] == false && map[x][y] == 1) {
//๋ฐฉ๋ฌธ ๊ธฐ๋ก์ ๋จ๊ธด๋ค.
marked[x][y] = true;
//๋ฐฉ๋ฌธ๊ธฐ๋ก์ ๋จ๊ธฐ๋ฉด์, land ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
map[x][y] = land;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
//์ด๋ํ๋ฉด์ ๋งต ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๊ฑฐ๋, ๋ฐฉ๋ฌธํ์ง ์์ ์ก์ง์ธ ๊ฒฝ์ฐ dfs๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
if (((0 <= nx && nx < N) && (0 <= ny && ny < N)) && marked[nx][ny] == false && map[nx][ny] == 1) {
dfs(nx, ny);
}
}
}
}
๋จผ์ , ๋ผ๋ฒจ๋ง ์์ ์ dfs๋ ์ฌ๊ท๋ฅผ ์ด์ฉํด์ ๊ตฌํํ์๋ค.
๋ฐฉ๋ฌธ ํ์๊ฐ ์๋์ด์์ผ๋ฉด์, map[x][y]==1 ์ฆ, ์ ๋ ฅ๋ฐ์ map์ ์ํด์ 1์ ์ก์ง์ด๊ธฐ ๋๋ฌธ์,
๋ฐฉ๋ฌธ ํ์๊ฐ ์๋์ด ์๋ ๋ถ์ด์๋ ์ก์ง ์ขํ๋ ๋ชจ๋ ์ง๋๊ฐ๊ฒ ๋ ๊ฒ์ด๋ค.
์,ํ,์ข,์ฐ๋ก ์ด๋ํ๋ฉด์, ๋งต์ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๊ณ , ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉด์, ์ก์ง๋ผ๊ณ ํ๋จ๋๋ฉด land๊ฐ์ ๋ถ์ฌํ๋๋ก ๊ตฌํํ์๋ค.
3. ์ต๋จ ๊ฑฐ๋ฆฌ ๊ณ์ฐํ๊ธฐ
static void bfs(int x, int y, int land) {
//bfs๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ Queue
Queue<int[]> q = new LinkedList<>();
//bfs๋ฅผ ์ํด ํ์ ํด๋น ์ขํ๋ฅผ ๋ฃ๋๋ค.
// x์ขํ y์ขํ ๋ค๋ฆฌ๊ธธ์ด(๊ธฐ๋ณธ๊ฐ์ 0์ด๋ค, ๋ฐ๋ค๋ฅผ ๋ง๋๋ฉด 1์ฉ ์ฆ๊ฐ์ํจ๋ค.)
q.offer(new int[]{x, y, 0});
//๋ฐฉ๋ฌธํ๋ ๋ฐ๋ค์ธ์ง ์ฒดํฌํ๊ธฐ ์ํด ๋ฐฐ์ด ์ด๊ธฐํ
boolean[][] marked = new boolean[N][N];
//ํ๊ฐ ์์ ํ ๋น ๋๊น์ง ์งํ
while (!q.isEmpty()) {
int[] point = q.poll();
for (int k = 0; k < 4; k++) {
//ํ์ ๋ฃ์๋ ํฌ์ธํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์,ํ,์ข,์ฐ ํ์
int nx = point[0] + dx[k];
int ny = point[1] + dy[k];
//๋งต ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ, PASS
if (nx < 0 || ny < 0 || nx >= N || ny >= N) {
continue;
}
//๊ฐ์ ์ฌ์ผ ๊ฒฝ์ฐ, ๋ค๋ฆฌ๋ฅผ ๋์ ์ ์์ผ๋ฏ๋ก ๋ฐฉ๋ฌธ ํ์๋ง ํ๊ณ ๋์ด๊ฐ๋ค.
if (map[nx][ny] == land) {
continue;
}
//๋ฐฉ๋ฌธํ๋ ๋ฐ๋ค์ธ ๊ฒฝ์ฐ ๋์ด๊ฐ๋ค.
if (marked[nx][ny] == true) {
continue;
}
// ํฌ์ธํธ๊ฐ 0์ด๊ณ , ๋ฐฉ๋ฌธํ์ง ์์ ๋ฐ๋ค๋ผ๋ฉด?
if (map[nx][ny] == 0) {
//ํ์ ์ถ๊ฐํด์ค ๋ค, ๋ค๋ฆฌ ๊ธธ์ด๋ฅผ 1์นธ ๋๋ฆฐ๋ค.
// ๋ฐ๋ค ๋ฐฉ๋ฌธ ํ์๋ฅผ ๋จ๊ธด๋ค.
q.offer(new int[]{nx, ny, point[2] + 1});
marked[nx][ny] = true;
//๋ค๋ฅธ ์ฌ์ ๋์ฐฉํ๋ค๋ฉด? ๋์ด์ ํ์์ ํ์ง ์์๋ ๋๋ค.
} else if (map[nx][ny] != land) {
//๋ค๋ฆฌ ๊ธธ์ด๋ฅผ ๋๋ฆฌ์ง ์๊ณ , ์ต์๊ฐ์ ํ์ธํ๋ค.
min = Math.min(min, point[2]);
return;
}
}
}
}
์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด์๋ ์ขํ ๋ง๊ณ ๋, ๋ค๋ฆฌ ๊ธธ์ด๋ฅผ ์ ์ฅํ ์ ์๊ฒ 3๊ฐ์ ์์๋ฅผ ๊ฐ๋ int[] ๋ฐฐ์ด์ q์ ๋ฑ๋ก์์ผ์ฃผ์ด์ผ ํ๋ค.
๊ฐ์ ์ฌ์ ์ก์ง์ธ ๊ฒฝ์ฐ์๋, ๋ค๋ฆฌ๊ธธ์ด๋ ์ฆ๊ฐ์ํค์ง ์๊ณ , ๋ฐฉ๋ฌธ ํ์๋งํ๊ณ ๋์ด๊ฐ๊ณ , ๋ฐฉ๋ฌธํ์ง ์์ ๋ฐ๋ค๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์๋ง ๋ค๋ฆฌ๊ธธ์ด๋ฅผ ์ฆ๊ฐ์์ผ์ฃผ๋ฉฐ ํ์ ๋ฃ์ด์ฃผ๊ณ bfs๋ฅผ ๊ณ์ํ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ค๊ฐ, ๋ค๋ฅธ ๋ผ๋ฒจ์ ๊ฐ์ง(land ๊ฐ) ์ก์ง๋ฅผ ๋ง๋๊ฒ ๋์ ๋, ๋ค๋ฆฌ ๊ธธ์ด๋ฅผ ์ฆ๊ฐ์ํค์ง ์๊ณ ์ด๋ฅผ min๊ฐ์ ์ ์ฅํด์ค๋ค.
๊ฐ ์ฌ๋ง๋ค bfs๋ฅผ ํ๋ฉด์, ์ด min ๊ฐ์ ๊ณ์ํด์ ์์ ๊ฐ์ผ๋ก ๊ฐฑ์ ๋ ๊ฒ์ด๋ค!
๋ค๋ฅธ ์ฌ๋๋ค์ ๋ฐฐ์ด์ ์ฌ๋ฌ๊ฐ ์ด ๊ฒฝ์ฐ๋ ์๊ณ , map๊ฐ์ ๋ฐ๊ฟ์ ํผ ์ฌ๋๋ ์๊ณ ๋ค์ํ์ง๋ง, ๊ฐ์ฅ ์ง๊ด์ ์ผ๋ก ์ดํดํ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ๋๊ฒ ์ค์ํ ๊ฒ ๊ฐ๋ค.
๋ด ํ์ด๋ฅผ ๋ณด๊ณ ๋ค๋ฅธ ๋ถ๋ค๋ ์ฝ๊ฒ ์ด ๋ฌธ์ ๋ฅผ ์ดํดํ์ผ๋ฉด ํ๋ ๋ฐ๋์ด๋ค!