๐ ๋ฌธ์
https://www.acmicpc.net/problem/16137
๋ฌธ์
๊ฒฌ์ฐ์ ์ง๋ ๋ ์ฌ๋ฌ ์ฌ๊ณผ ์ ๋ฒฝ์ผ๋ก ์ด๋ฃจ์ด์ง ์ง์ญ์์ ์ด๊ณ ์๋ค. ์ด ์ง์ญ์ ๊ฒฉ์๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, ์ํ์ข์ฐ๋ก ์ธ์ ํ ์นธ์ผ๋ก ๊ฐ๋ ๋ฐ 1๋ถ์ด ๊ฑธ๋ฆฐ๋ค.
7์ 7์ผ์ ๊ฒฌ์ฐ์ ์ง๋ ๊ฐ ์ค์๊ต๋ฅผ ๊ฑด๋ ๋ง๋ ์ ์๋ ๋ ์ด๋ค. ๊ทธ๋ฐ๋ฐ ๊ณ ๋ นํ๋ก ์ธํด์ ๊น๋ง๊ท์ ๊น์น๊ฐ ์์ ์ฒ๋ผ ์ปค๋ค๋ ์ค์๊ต๋ฅผ ๋ง๋ค ์ ์๋ค. ๊ทธ๋์ ์์ฆ์ ์ผ๋ถ ์ ๋ฒฝ์๋ง ๋ค๋ฆฌ๋ฅผ ๋ง๋ค์ด ์ฃผ๊ณ ์๊ณ , ๊ทธ๋ง์ ๋ ํ๋ค์ด์ ๋ช ๋ถ ์ฃผ๊ธฐ๋ก ์ค์๊ต๋ฅผ ์ง๊ณ ํด์ฒดํ๋ ์์ ์ ๋ฐ๋ณตํด์ผ ํ๋ค. ํ ๋ฒ ์ง์ ์ค์๊ต๋ 1๋ถ ๋์ ์ ์งํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ์ค์๊ต๊ฐ 3๋ถ๊ณผ 4๋ถ ์ฃผ๊ธฐ๋ผ๋ฉด, ๊ฑด๋ ์ ์๋ ์๊ฐ์ ์๋ ๊ทธ๋ฆผ์์ ์ด๋ก์์ผ๋ก ํ์ํ ๋ถ๋ถ๊ณผ ๊ฐ๋ค.
T = 3 | T = 4 |
์ค์๊ต๋ ์ด์ฒ๋ผ ๋งค์ฐ ๋ถ์์ ํ๋ฏ๋ก, ๊ฒฌ์ฐ๋ ์์ ์ ์ํด ๋ ๋ฒ ์ฐ์์ผ๋ก ์ค์๊ต๋ฅผ ๊ฑด๋์ง๋ ์๊ธฐ๋ก ํ๋ค.
๊น๋ง๊ท์ ๊น์น๋ ์กฐ๊ธ์ด๋ผ๋ ๊ฒฌ์ฐ๋ฅผ ๋ ๋์์ฃผ๊ธฐ ์ํด, ์ ๋ฒฝ์ ์ ํํ ํ๋ ๊ณจ๋ผ ์ฃผ๊ธฐ๊ฐ M๋ถ์ธ ์ค์๊ต๋ฅผ ํ๋ ๋ ๋์ ์ฃผ๊ธฐ๋ก ํ๋ค. ๋จ, ์ด๋ฏธ ์ค์๊ต๋ฅผ ์ง๊ธฐ๋ก ์์ ํ ์ ๋ฒฝ์๋ ์ค์๊ต๋ฅผ ํ๋ ๋ ๋์ ์ ์๊ณ , ์๋์ ๊ฐ์ด ์ ๋ฒฝ์ด ๊ฐ๋ก์ ์ธ๋ก๋ก ๊ต์ฐจํ๋ ๊ณณ์๋ ์ค์๊ต๋ฅผ ๋์ ์ ์๋ค.
๊ฒฌ์ฐ๊ฐ ์ง๋ ์๊ฒ ๋์ฐฉํ ์ ์๋ ์ต์์ ์๊ฐ์ ์ฐพ์ ๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์งํ์ ํ๊ณผ ์ด์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ์ ์ N (2 ≤ N ≤ 10)๊ณผ ์๋ก ๋ง๋ค์ด์ง๋ ์ค์๊ต์ ์ฃผ๊ธฐ๋ฅผ ์๋ฏธํ๋ ์ ์ M(2 ≤ M ≤ 20)์ด ์ฃผ์ด์ง๋ค.
๋ค์ N๊ฐ์ ์ค์๋ ์ค๋ง๋ค ๋ฐฐ์ด์ ๊ฐ ํ์ ๋ํ๋ด๋ N๊ฐ์ ์ ์๊ฐ ํ ๊ฐ์ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๊ฐ ์นธ์ ๋ค์ด๊ฐ๋ ๊ฐ์ 0 ์ด์ 20 ์ดํ์ด๋ค.
๋ํ, ๊ฐ ์นธ์ ๋ค์ด๊ฐ๋ ์ ์์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- 1: ์ด๋ํ ์ ์๋ ์ผ๋ฐ์ ์ธ ๋
- 0: ๊ฑด๋ ์ ์๋ ์ ๋ฒฝ
- 2 ์ด์์ ์: ์ ํ์๋ ์ ๋งํผ์ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ ์ค์๊ต
๊ฒฌ์ฐ์ ์์์ ์ ์งํ์ ๋งจ ์ผ์ชฝ ์ (0, 0) ์ด๊ณ , ์ง๋ ๊ฐ ์ฌ๋ ๊ณณ์ ์งํ์ ๋งจ ์ค๋ฅธ์ชฝ ์๋์ธ (N-1, N-1)์ด๋ค. ๊ฒฌ์ฐ๊ฐ ์์์ ์์ ์ถ๋ฐํ๋ ์๊ฐ์ 0๋ถ์ด๋ค. ๊ฒฌ์ฐ์ ์ง๋ ๊ฐ ์ฌ๋ ๊ณณ์ ์ผ๋ฐ์ ์ธ ๋ ์ด๋ค.
๊ฒฌ์ฐ์ ์ง๋ ๊ฐ ๋ฌด์กฐ๊ฑด ๋ง๋ ์ ์๋ ๊ฒฝ์ฐ๋ง ์ฃผ์ด์ง๋ค. ๋ํ, ์ฃผ์ด์ง๋ ์งํ ์ ๋ณด์์ ์ค์๊ต๋ฅผ ๋ฐ๋์ ํ๋ ์ด์ ๋์ ์ ์๋ค. ์ ๋ฒฝ์ด ๊ฐ๋ก์ ์ธ๋ก๋ก ๊ต์ฐจํ๋ ์ง์ ์๋ ์ค์๊ต๊ฐ ์ค์น๋์ด ์์ง ์๋ค.
์ถ๋ ฅ
๊ฒฌ์ฐ๊ฐ ์ง๋ ์๊ฒ ๊ฐ ์ ์๋ ์ต์์ ์๊ฐ์ ์ถ๋ ฅํ๋ค.
โ๏ธ ํ์ด
๐ก ๋ฌธ์ ๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ๊ผญ ์ง๊ณ ๋์ด๊ฐ์ผ ํ๋ ํฌ์ธํธ๊ฐ ์๋ค.
1. ์ค์๊ต๋ ์ฃผ๊ธฐ์ ๋ง์ถฐ์๋ง ๊ฑด๋ ์ ์๋ค. ํ์ฌ ์๊ฐ์ด T์ด๋ผ๋ฉด, ๋ค์ ์์น๊ฐ ์ค์๊ต์ผ ๋ T+1์ด๊ฐ ์ค์๊ต์ ์ฃผ๊ธฐ์ ๋ง์์ผ ๊ฑด๋ ์ ์๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ํ์ฌ ์์น์์ ์ค์๊ต๋ก ๊ฑด๋๊ฐ๋ ค ํ ๋, (T+1)%(์ค์๊ต ์ฃผ๊ธฐ)๊ฐ 0์ด ๋์ด์ผ ๊ฑด๋ ์ ์๋ค.
2. ์ฃผ๊ธฐ๊ฐ ๋ง์ง ์๋๋ผ๋, ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๊ฑด๋๋ ๋ฐฉ๋ฒ๋ ๊ณ ๋ คํด์ผ ํ๋ค.
3. ๋ ๋ฒ ์ฐ์ ์ค์๊ต๋ฅผ ๊ฑด๋์ง๋ ์๋๋ค. ํ์ฌ ์์๋ ์์น๊ฐ ์ค์๊ต ์๋ผ๋ฉด, ๋ค์ ์์น๋ก ์ค์๊ต๋ฅผ ๊ณ ๋ฅผ ์ ์๋ค.
4 ์ ๋ฒฝ์ด ๊ต์ฐจํ๋ ์ผ์ด์ค๋ ๋ฏธ๋ฆฌ ์ฒดํฌํ์ฌ ์์ ์ด๋์ ๊ณ ๋ คํ์ง ์๋๋ก ์ฒ๋ฆฌํ๋ค. ์ฝ๋์์๋ ๊ฐ์ -1๋ก ๋ฃ์ด์ฃผ์๋ค. ์ผ๋ฐ ๋ (1), ์ ๋ฒฝ(0), ์ค์๊ต(2 ์ด์์ ๊ฐ)์ผ๋ก ํํ๋๋ฏ๋ก -1๋ก ์ฒ๋ฆฌํ ๊ต์ฐจ์ง์ญ์ ์ฝ๋ ์งํ์ ๊ณ ๋ ค๋์ง ์๋๋ค.
5. ๋ค์ ์์น๊ฐ ์ ๋ฒฝ์ด๋ผ๋, ์ ์ค์๊ต๋ฅผ ์์ง ๋์ง ์์ ๊ฒฝ์ฐ์ ํํด ๊ทธ ์ ๋ฒฝ์ ์ค์๊ต๋ฅผ ์๋ก ์ค์นํ๊ณ ๋์ด๊ฐ ์ ์๋ค. ๋งฅ๋ฝ ์์ผ๋ก๋ ์์ ์์ ์ ๋ฒฝ ์ค ํ ๊ณณ์ ๊ณจ๋ผ ์ ์ค์๊ต๋ฅผ ๋จผ์ ์ค์นํด๋๊ณ ์ถ๋ฐํ์ง๋ง, ์ด๋ ๊ณณ์ ๋๋ ๊ฒ์ด ์ต์ ์ธ์ง ๋ฐ๋ก ๊ณ ๋ คํ ์ ์๋ค. ๋ฐ๋ผ์ ์ผ๋จ ์ถ๋ฐ์ ํ๊ณ , ์ค์๊ต๋ฅผ ์ค์นํ ๊ฒฝ์ฐ/ ์ค์นํ์ง ์์ ๊ฒฝ์ฐ์ ์ผ์ด์ค๋ฅผ ๋ชจ๋ ๋ค๊ณ ๋ค๋๋ฉฐ, ์ค์๊ต๋ฅผ ์์ง ์ค์นํ์ง ์์ ๊ฒฝ์ฐ์ ์ ๋ฒฝ์ ๋ง๋๋ฉด ๊ทธ๋ ๊ทธ ๊ณณ์ ์ค์๊ต๊ฐ ์ค์น๋์ด ์๊ณ ๊ทธ ์๋ฅผ ๊ฑด๋๋ค๊ณ ์๊ฐํ๊ณ ๋์ด๊ฐ๋ ๊ฒ์ด๋ค. ์ด ๋ ์ฃผ๊ธฐ๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ 1๋ฒ์ ๋ฐ๋ฅธ๋ค.
6. ์ง๋ ์ ์์น์ ๋์ฐฉํ๋ฉด ๋ฐ๋ก ๋ฆฌํดํ๋ค.
๐ ์ ๋ฆฌ
โ๏ธ ์ง๋๋ฅผ ์ ๋ ฅ๋ฐ์ ํ, ๊ต์ฐจ์ง์ญ์ ์ฒดํฌ ๋ฐ ์ฒ๋ฆฌ(-1์ ์ ์ฅ)ํด๋๋๋ค.
โ๏ธ BFS ํ์์ ์์ํ๋ค.
โ๏ธ ์ฌ๋ฐฉํ์ ์ ์๋ ์์๋๋ก ๊ณ ๋ คํ๋ค.
(1) ๋ค์ ์์น๊ฐ ๋ ์ผ ๋: ๋์ด๊ฐ๋ค.
(2) ๋ค์ ์์น๊ฐ ์ค์๊ต ์์ผ ๋:
-1) ํ์ฌ ์์น๊ฐ ๋ ์ผ ๊ฒฝ์ฐ: ์ฃผ๊ธฐ์ ๋ง์ผ๋ฉด ๋ค์ ์์น๋ก, ๋ง์ง ์์ผ๋ฉด ๋๊ธฐ๋ฅผ ์ํด ํ์ฌ ์์น๋ฅผ ํ์ ๋ฃ๋๋ค.
-2) ํ์ฌ ์์น๊ฐ ์ค์๊ต ์์ผ ๊ฒฝ์ฐ: ๋์ด๊ฐ์ง ์๋๋ค.
(3) ๋ค์ ์์น๊ฐ ์ ๋ฒฝ์ผ ๋:
-1) ์ด๋ฏธ ์ ์ค์๊ต๋ฅผ ์ค์นํด์ ๋์ด์จ ์ ์ด ์๋ ๊ฒฝ์ฐ: ๋์ด๊ฐ์ง ์๋๋ค.
-2) ์ ์ค์๊ต๋ฅผ ์ค์นํ ์ ์ด ์๋ ๊ฒฝ์ฐ: ์ค์๊ต๋ฅผ ์ค์นํ๋ค๊ณ ๊ณ ๋ คํ๊ณ (2)๋ฒ์ผ๋ก ๊ฐ๋ค.
๐ป ์์ค์ฝ๋: ์๋ฐ(Java)
public class Main_๋ฐฑ์ค_16137_๊ฒฌ์ฐ์์ง๋
_๊ณจ๋2 {
/**
* ์ค์๊ต ์ฃผ๊ธฐ ์์ = T%์ฃผ๊ธฐ==0์ด์ด์ผ ๊ฑด๋ ์ ์๋ค. ๊ฑด๋๋๋ฐ 1์ด
* ๋ ๋ฒ ์ฐ์์ผ๋ก ์ค์๊ต๋ฅผ ๊ฑด๋์ง๋ ์๋๋ค = ์ด๋ฏธ ์ค์๊ต ์๋ฉด ๋ ์ค์๊ต ์๋ก ๊ฐ์ง ์๋๋ค.
*
* visited[r][c][k]: k=0(์๋ก ๋์ ์ค์๊ต๊ฐ ์์) or 1(์๋ก ์ค์๊ต ๋๊ณ ๊ฑด๋)
* 1. BFS
* 2. ํ์ฌ ์์น๊ฐ ์ค์๊ต ์๊ฐ ์๋๊ณ (1) ๊ฑด๋ ์ ์๋ ์ค์๊ต๊ฐ ์์ผ๋ฉด ๊ฑด๋๋ค.
* 3. ์๋ก ์ค์๊ต๋ฅผ ๋์ ์ ์๋ ๊ฒฝ์ฐ ๋๊ณ ๊ฑด๋๋ค.
* 4. ์ง๋
์๊ฒ ๋์ฐฉํ๋ฉด ์ต์์๊ฐ์ ๋ฆฌํดํ๋ค.
* */
static int N, M, result = Integer.MAX_VALUE;
static int[][] map;
static boolean[][][] visited;
static int[] dr = {1, -1, 0, 0};
static int[] dc = {0, 0, 1, -1};
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new int[N][N];
visited = new boolean[N][N][2];
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());
}
}//input
findCross();
bfs();
System.out.println(result);
}//end of main
private static void findCross() {
int cnt = 0;
for (int r = 0; r < N; r++) {
for (int c = 0; c < N; c++) {
if(map[r][c]==0) { // ์ ๋ฒฝ์ผ ๋
cnt=0;
// ์ข์/ ์ขํ/ ์ฐ์/ ์ฐํ
if((r-1>=0 && map[r-1][c]==0) || (r+1<N && map[r+1][c]==0)) cnt++;
if((c-1>=0 && map[r][c-1]==0) || (c+1<N && map[r][c+1]==0)) cnt++;
if(cnt==2) map[r][c]=-1;
}
}
}
}
private static void bfs() {
Queue<int[]> queue = new LinkedList<int[]>();
queue.offer(new int[] {0,0,0,0});//r,c,k,t
visited[0][0][0] = true;
while(true) {
int[] cur = queue.poll();
int r = cur[0];
int c = cur[1];
int k = cur[2];
int t = cur[3];
int nr, nc, nt=t+1;
if(r==N-1 && c==N-1) {
result = t;
break;
}
for (int i = 0; i < 4; i++) {
nr = r + dr[i];
nc = c + dc[i];
if(nr<0||nc<0||nr>=N||nc>=N||visited[nr][nc][k]) continue;
if(map[nr][nc]==1) { // ๋ค์ ์์น๊ฐ ๋
์ผ ๋
visited[nr][nc][k] = true;
queue.offer(new int[] {nr, nc, k, nt});
}
if(map[nr][nc]>1) { // ๋ค์ ์์น๊ฐ ์ค์๊ต ์์ผ ๋
if(map[r][c]==1) {// ํ์ฌ ์์น๊ฐ ๋
์ด์ด์ผ๋ง ์ด๋๊ฐ๋ฅ
if(nt%map[nr][nc]==0) {// ์ด๋๊ฐ๋ฅํ๋ฉด
queue.offer(new int[] {nr, nc, k, nt});
}else {
queue.offer(new int[] {r, c, k, nt});
}
}
}
if(map[nr][nc]==0 && k==0) { // ๋ค์ ์์น๊ฐ ๋
์ผ ๋
if(nt%M==0) queue.offer(new int[] {nr,nc,k+1,nt});
else queue.offer(new int[] {r,c,k,nt});
}
}
}
}
}//end of class
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ