๋ฌธ์
https://www.acmicpc.net/problem/16236
16236๋ฒ: ์๊ธฐ ์์ด
N×N ํฌ๊ธฐ์ ๊ณต๊ฐ์ ๋ฌผ๊ณ ๊ธฐ M๋ง๋ฆฌ์ ์๊ธฐ ์์ด 1๋ง๋ฆฌ๊ฐ ์๋ค. ๊ณต๊ฐ์ 1×1 ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ํ ์นธ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์ต๋ 1๋ง๋ฆฌ ์กด์ฌํ๋ค. ์๊ธฐ ์์ด์ ๋ฌผ๊ณ ๊ธฐ๋ ๋ชจ๋ ํฌ๊ธฐ๋ฅผ ๊ฐ
www.acmicpc.net
๋ด ๋ฌธ์ ํ์ด
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.StringTokenizer;
public class BOJ_16236 {
static int n;
static int[][] map;
static int[] start;
static int cnt, shark, ans;
static int[] dx = {0, 0, -1, 1};
static int[] dy = {-1, 1, 0, 0};
public static int[] bfs(Deque<int[]> que, int[][] visited, int[] fish) {
while(!que.isEmpty()) {
int now[] = que.removeFirst();
int x = now[0];
int y = now[1];
for(int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 0 || ny < 0 || nx >= n || ny >= n || map[nx][ny] > shark || visited[nx][ny] > 0) continue;
visited[nx][ny] = visited[x][y] + 1;
if(map[nx][ny] < shark && map[nx][ny] > 0) { // ์์ด๋ณด๋ค ์์ ๋ฌผ๊ณ ๊ธฐ ๋ง๋ฌ์ ๋ => ๊ธฐ์กด์ ๋จน์ผ๋ ค๊ณ ํ๋ ๋ฌผ๊ณ ๊ธฐ๋ณด๋ค ์ ํฉํ์ง ํ์ธ ํ, ๋จน์ ๋ฌผ๊ณ ๊ธฐ ์
๋ฐ์ดํธ
if(fish[2] == 0 ||
fish[2] > visited[nx][ny] ||
(fish[2] == visited[nx][ny] && (fish[0] > nx || (fish[0] == nx && fish[1] > ny)))) {
fish[0] = nx;
fish[1] = ny;
fish[2] = visited[nx][ny];
}
}
que.add(new int[]{nx, ny});
}
}
return fish;
}
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
n = Integer.parseInt(in.readLine());
map = new int[n][n];
for(int i = 0; i < n; i++) {
st = new StringTokenizer(in.readLine());
for(int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
if(map[i][j] == 9) start = new int[]{i, j}; // ์๊ธฐ ์์ด์ ์์น
}
}
shark = 2;
while(true) {
Deque<int[]> que = new ArrayDeque<>();
que.add(start);
int[][] visited = new int[n][n];
visited[start[0]][start[1]] = 1;
map[start[0]][start[1]] = 0;
int[] now = bfs(que, visited, new int[]{0, 0, 0});
if(now[2] == 0) { // ๋์ด์ ๋จน์ ๋ฌผ๊ณ ๊ธฐ ์์ ๋
System.out.println(ans);
return;
}
ans += now[2]-1; // ๋ฌผ๊ณ ๊ธฐ ๋จน๋๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ ๋์
cnt++; // ๋จน์ ๋ฌผ๊ณ ๊ธฐ ๊ฐ์ ๋์
if(cnt == shark) {
cnt = 0;
shark++; // ์์ด ํฌ๊ธฐ๋งํผ ๋ฌผ๊ณ ๊ธฐ ๋จน์ผ๋ฉด ์์ด ํฌ๊ธฐ ํค์์ฃผ๊ธฐ
}
map[now[0]][now[1]] = 0; // ๋ฐฉ๊ธ ๋จนํ ๋ฌผ๊ณ ๊ธฐ์ ์์น๋ ๋น ์นธ์ผ๋ก ๋ง๋ค์ด์ฃผ๊ธฐ
start = Arrays.copyOf(now, 2); // ์๊ธฐ ์์ด์ ์์น๋ฅผ ๋ฐฉ๊ธ ๋จน์ ๋ฌผ๊ณ ๊ธฐ ์์น๋ก ์ฎ๊ฒจ์ฃผ๊ธฐ
}
}
}
๐ ์๋ฎฌ๋ ์ด์ + BFS ๋ฌธ์
์์ด๊ฐ ํ ๋ฒ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ ๋๋ง๋ค, bfs ํ์์ ํตํด ์ต์ ์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ฐพ๋ ๊ฒ์ ๋ฐ๋ณตํด์ฃผ๋ ์์ผ๋ก ๊ตฌํ
- main ๋ฉ์๋ ์์์ while ๋ฐ๋ณต์ ํตํด ์์ด๊ฐ ์ต์ ์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ฐพ๋ ๊ณผ์ ์ ํํํ๋ค.
ํ ๋ฒ์ while ์คํ == ์์ด๊ฐ ํ ๋ฒ ๋จน๋ ์ต์ ์ ๋ฌผ๊ณ ๊ธฐ ์ฐพ์ ๋จน๊ธฐ - start ๋ฐฐ์ด์๋ ์์ด์ ์์์ ์ด ์ ์ฅ๋๋๋ฐ, que์ start ์ ๋ณด๋ฅผ ๋ฃ์ด์ฃผ๊ณ
visited์ map์ start ์์น๋ฅผ ์ ์ ํ ์ด๊ธฐํ์ํจ ํ bfs ํ์์ ๋๋ ค์ฃผ์๋ค.
(map์ ์ด์ ์์ด๊ฐ ๋จน์ ๋ฌผ๊ณ ๊ธฐ ์์น๋ก ์ด๋ํ ๊ฒ์ด๋ฏ๋ก 0์ผ๋ก ์ด๊ธฐํํ๊ณ ,
visitied๋ ์์ด์ ์์น๋ฅผ ์์์ ์ผ๋ก ํ์ํ ๊ฒ์ด๋ฏ๋ก 1๋ก ์ด๊ธฐํํ๋ค.) - bfs ํ์์ ํน๋ณํ ์ ์ ์์ผ๋, ํ์ธํด์ผ ํ ์ ์
์์ด๋ณด๋ค ์์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋ง๋ฌ๋ค๋ฉด, ๊ธฐ์กด์ ๋จน์ผ๋ ค๊ณ ํ๋ ๋ฌผ๊ณ ๊ธฐ๋ณด๋ค
๋ ์ ํฉํ์ง(๋ ํฐ์ง) ํ์ธ ํ, ๋จน์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๊ฐฑ์ ํด์ฃผ๋ ๋ถ๋ถ,,!! - ๊ทธ๋ฆฌ๊ณ ์์ ๊ฐฑ์ ์ fish ๋ฐฐ์ด์ ํตํด ์งํ๋๋๋ฐ, ์ด fish ๋ฐฐ์ด์ ๋ฆฌํด๋๋ ๊ฐ์ผ๋ก,
bfs ํ์ ์ข ๋ฃ ์ ์ด ๋ฐฐ์ด์ ํตํด ์ด๋ค ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์์ง, ํน์ ๋จน์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์์๋์ง๋ฅผ ๊ฒฐ์ ํ๋ค. - bfs ๋ฉ์๋ ์ข
๋ฃ ํ, bfs ๋ฉ์๋๊ฐ ๋ฐํํ fish ๋ฐฐ์ด์ now๋ผ๋ ๋ฐฐ์ด์ ๋ด์์ฃผ์๋๋ฐ,
now[2] ๊ฐ์ด 0์ด๋ผ๋ฉด ๋จน์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์์๋ค๋ ๋ป์ด๋ฏ๋ก ans๋ฅผ ์ถ๋ ฅํ๊ณ ๋ฐ๋ก ๋ฆฌํดํ๋ค. - ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ ans์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋๋ฐ์ ๊ฑธ๋ฆฐ ์๊ฐ์ธ now[2]-1์ ๋ํด์ฃผ์๊ณ ,
cnt๋ฅผ ํตํด ๋จน์ ๋ฌผ๊ณ ๊ธฐ์ ๊ฐ์๋ฅผ ๊ณ์ ๋์ ํด์ฃผ์๋ค.
cnt ๊ฐ์ด ์์ด์ ํฌ๊ธฐ์ ๊ฐ์์ง๋ฉด cnt๋ ๋ค์ 0์ผ๋ก ์ด๊ธฐํ, ์์ด์ ํฌ๊ธฐ๋ 1 ๋๋ ธ๋ค. - ๋ฐฉ๊ธ ๋จน์ ๋ฌผ๊ณ ๊ธฐ์ map ์์น๋ 0์ผ๋ก ๋ฐ๊ฟ์ฃผ์๊ณ ,
start ๋ฐฐ์ด์ ๋ฐ๋ ์์ด์ ์์น๋ก ์ด๊ธฐํํ์ฌ ๋ค์๋ถํฐ ์๋ก์ด ์์์ ์์ ํ์ํ ์ ์๊ฒ ํ๋ค.
๐ก ํผ๋๋ฐฑ
- ์ฃ ๊ธ ๋ณต์กํ,, ๋ฌธ์ ์์ง๋ง!! ์ฐจ๊ทผ์ฐจ๊ทผ ์ดํดํ๊ณ ํ๋ฉด ์ด๋ ค์ด ๋ฌธ์ ๋ ์๋์๋ค.
๋๊ธ