BOJ_G3_16236
๐ [G3_16236] ์๊ธฐ ์์ด
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int[][] map;
static int N;
static int[] dx = { 0, -1, 0, 1 };
static int[] dy = { -1, 0, 1, 0 };
static class Node {
int x;
int y;
public Node(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
// **** input start ****
N = Integer.parseInt(br.readLine());
map = new int[N][N];
// ์๊ธฐ์์ด
Node shark = null;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
// ์์ด ์์น ์ง์
if (map[i][j] == 9) {
// ์์ด ์์น ์ ์ฅํ๊ณ 0์ผ๋ก ์ด๊ธฐํ - ์ง๋๊ฐ ์ ์๊ฒ
shark = new Node(j, i);
map[i][j] = 0;
}
}
}
// **** input end ****
int res = bfs(shark);
System.out.println(res);
} // main end
static int bfs(Node shark) {
int ans = 0;
// ์์ดํฌ๊ธฐ
int sharkSize = 2;
// ์์ดํฌ๊ธฐ์กฐ์ ๋ณ์
int cnt = 0;
while (true) {
// ๋ค์ ๋จน์ ๋ฌผ๊ณ ๊ธฐ ์์น
int x = Integer.MAX_VALUE;
int y = Integer.MAX_VALUE;
int d = Integer.MAX_VALUE;
Queue<Node> queue = new LinkedList<Node>();
// ์ด๋๊ฑฐ๋ฆฌ ์ ์ฅ ๋ฐฐ์ด
int[][] distance = new int[N][N];
// ํ์ฌ ์๊ธฐ์์ด ์์น๋ถํฐ ์ ์ฅ
queue.add(shark);
// bfs ํ์
while (!queue.isEmpty()) {
Node current = queue.poll();
// 4๋ฐฉํฅ ํ์
int nx, ny;
for (int i = 0; i < 4; i++) {
nx = current.x + dx[i];
ny = current.y + dy[i];
// ๋ฒ์๋ฅผ ๋๊ฑฐ๋ ์์ ๋ณด๋ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฑฐ๋ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์์น๋ x
if (nx < 0 || ny < 0 || nx > N - 1 || ny > N - 1 || map[ny][nx] > sharkSize
|| distance[ny][nx] != 0)
continue;
// ์ด๋ ํ์ ์ ์ฅ
distance[ny][nx] = distance[current.y][current.x] + 1;
// ์ฐ์ ์์ ์ง์
if(map[ny][nx] != 0 && map[ny][nx] < sharkSize) {
// ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋๋ค
if(d > distance[ny][nx]) {
d = distance[ny][nx];
x = nx;
y = ny;
}
// ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ
else if(d == distance[ny][nx]) {
// ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๋ฌผ๊ณ ๊ธฐ
if(y == ny) {
if(x > nx) {
x = nx;
y = ny;
}
}
// ๊ฐ์ฅ ์์ ์๋ ๋ฌผ๊ณ ๊ธฐ
else if(y > ny) {
x = nx;
y = ny;
}
}
}
queue.add(new Node(nx, ny));
}
}
// ๋จน์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ๊ฒฝ์ฐ
if(x==Integer.MAX_VALUE && y == Integer.MAX_VALUE) {
break;
}
// ์๊ฐ ์ถ๊ฐ, ์ขํ 0์ผ๋ก
ans += distance[y][x];
map[y][x] = 0;
// ์ขํ ๊ฐฑ์ - ์ด๋ํ ๊ณณ์ผ๋ก
shark.x = x;
shark.y = y;
// ๋จน์ ๊ฒ ์ถ๊ฐ
cnt++;
// ์์ด ํฌ๊ธฐ ์ฆ๊ฐ
if(cnt == sharkSize) {
sharkSize++;
cnt = 0;
}
}
return ans;
}
} // class end
๐ค ๋์ ์๊ฐ
์ฒ์์ ๋ฌธ์ ๋ฅผ ์ดํดํ๊ณ DFS๋ก ํ์์ง๋งโฆ ์ค๊ฐ์ ์ฐ์ ์์ ์ง์ ์ ํด๊ฒฐํ์ง ๋ชปํด์ ํ
์คํธ์ผ์ด์ค 1~3๊น์ง๋ ๋ง์์ง๋ง ๋ค์๊ฒ๋ค์ ๋ค ํ๋ ธ๋ฐ.. ๋ฐฉ๋ฒ์ ์ฐพ์๋ด์ง ๋ชปํ๋ค..
๊ทธ๋์ ์ฐพ์๋ณด๋ bfs๋ฅผ ์ด์ฉํด์ ํผ ๊ฒ์ ๋ณด๊ณ ํ์ด๋ณด์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋๊ฑฐ๋ฆฌ ์ ์ฅ ๋ฐฐ์ด์ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ฒ ๋์๋ค.
- ํ์ฌ ์๊ธฐ์์ด ์์น๋ฅผ ์ ์ฅํ๊ณ , map ์ 0 ์ผ๋ก ์ง์ ( ์ง๋๊ฐ ์ ์๊ฒ )
- BFS๋ฅผ ํ์ฉํด ์กฐ๊ฑด๋ค์ ๊ณ ๋ คํ ๋ค ์กฐ๊ฑด์ ๋ถํฉํ๋ฉด ์ด๋๊ฑฐ๋ฆฌ ์ ์ฅ ๋ฐฐ์ด์ ๊ฐ์ ์ ์ฅํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ฐ์ ์์ ์ฒดํฌ๋ฅผ ํตํด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ ์์๋ฅผ ์ ํด์ค๋ค.
- ๋ค ๋๊ณ ๋์ ์๊ฐ์ ์ถ๊ฐํด์ฃผ๊ณ ์ขํ ๊ฐฑ์ ์ ํด์ฃผ๊ณ ์์ด ํฌ๊ธฐ๋ฅผ ์ฒดํฌํด์ค๋ค.
- ๋ฌผ๊ณ ๊ธฐ ๋จน์ ๊ฒ์ด ์์ ๋๊น์ง ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด ์ค๋ค.
์๋ฎฌ๋ ์ด์
๋ฌธ์ ์ธ๋ฐ ๋ด์ฉ์ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์์ผ๋ ์กฐ๊ฑด๋ค์ด ๋ง์์ ์ข ๋จธ๋ฆฌ๊ฐ ์ํ ๋ ๋ฌธ์ ์ด๋ค.
์ ๊ทผ์ ์ ๋๋ก ํด๋๊ณ ๋ค ํ์ง๋ชปํด์ ์ค๋ ๋ถ์ก๊ณ ์์๋๋ฐ ๋๋ฌด ์์ฌ์ ๋ ๋ฌธ์ ..