๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/goorm

[๊ตฌ๋ฆ„LEVEL] ๋ฏธ๋กœ์ฐพ๊ธฐ

by dar0m! 2020. 3. 24.
๋‚œ์ด๋„ ์ •๋‹ต๋ฅ 
โ˜…โ˜…โ˜…โ˜… -%

ํ”„๋ฆฌ๋ฏธ์—„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์œ„ํด๋ฆฌ ๋น„ํƒ€์•Œ๊ณ  ์‹œ์ฆŒ3 3์›” 2์ฃผ์ฐจ

 

goorm

๊ตฌ๋ฆ„์€ ํด๋ผ์šฐ๋“œ ๊ธฐ์ˆ ์„ ์ด์šฉํ•˜์—ฌ ๋ˆ„๊ตฌ๋‚˜ ์ฝ”๋”ฉ์„ ๋ฐฐ์šฐ๊ณ , ์‹ค๋ ฅ์„ ํ‰๊ฐ€ํ•˜๊ณ , ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ผ์šฐ๋“œ ์†Œํ”„ํŠธ์›จ์–ด ์ƒํƒœ๊ณ„์ž…๋‹ˆ๋‹ค.

www.goorm.io

๋ฌธ์ œ

N*N ํฌ๊ธฐ์˜ ๊ฒฉ์žํŒ์˜ (1,1)์—์„œ ์ถœ๋ฐœํ•˜์—ฌ (N,N)๊นŒ์ง€ ์ด๋™ํ•˜๊ณ ์ž ํ•œ๋‹ค. ๋ฏธ๋กœ๋Š” 0๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ๊ฐ์˜ ์ •์ˆ˜๋Š” ๋‹ค์Œ์„ ๋œปํ•œ๋‹ค.

  • 0: ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ํ†ต๋กœ
  • 1: ๋ฒฝ
  • 2...9: ์›Œํ”„๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐœํŒ, ๊ฐ™์€ ๋ฒˆํ˜ธ์˜ ๋ฐœํŒ๋ผ๋ฆฌ ์ด๋™ ๊ฐ€๋Šฅ 

2๋ฒˆ ๋ถ€ํ„ฐ 9๋ฒˆ๊นŒ์ง€๋Š” ๊ฒฉ์žํŒ์— ํ•ญ์ƒ 2๊ฐœ ์ด์ƒ ์กด์žฌํ•˜๋ฉฐ, ๊ฐ ์นธ์„ ์ด๋™ํ•˜๋Š” ์‹œ๊ฐ„๊ณผ ์›Œํ”„๋ฅผ ํ•˜๋Š” ์‹œ๊ฐ„์€ ๋ชจ๋‘ 1์ดˆ ๊ฑธ๋ฆฐ๋‹ค.

๋ฏธ๋กœ๋ฅผ ํƒˆ์ถœํ•˜๊ธฐ ์œ„ํ•ด ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•ด๋ณด์ž.

์‹œํ–‰์ฐฉ์˜ค

๋”๋ณด๊ธฐ

DFS๋กœ ์ ‘๊ทผํ–ˆ๋‹ค๊ฐ€ 7๊ฐœ์˜ ํ…Œ์ผ€์—์„œ runtime error๋‚˜์„œ DP๋กœ ๋ฐ”๊ฟจ๋”๋‹ˆ ๋ฌด๋ ค 90์ ์„ ๋งž์•˜์—ˆ๋‹ค.(7๋ฒˆ ํ…Œ์ผ€๋งŒ ํ‹€๋ฆผ)

์ •๋ง ๋ชจ๋ฅด๊ฒ ์–ด์„œ ํ•ด์„ค์„ ๋ณด๋‹ˆ๊นŒ BFS์˜€๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค์‹œ BFS๋กœ ์งœ๋ณด๋‹ˆ ๋‚˜๋Š” ๋˜ 3๊ฐœ๋งŒ ๋งž๊ณ  7๊ฐœ์˜ ํ…Œ์ผ€์—์„œ runtime error์˜€๋‹ค. ์—ฌ๊ธฐ์„œ ๋‚ด ์ฝ”๋“œ๊ฐ€ ๋ถ„๋ช… ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ตฌ๋‚˜ ์‹ถ์–ด์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค์‹œ ์‚ดํŽด๋ดค๋Š”๋ฐ, BFSํ•  ๋•Œ, ์›Œํ”„๋ฅผ ๋งŒ๋‚˜๋ฉด ์›Œํ”„ ๋จผ์ € queue์— ๋„ฃ์–ด์•ผํ•˜๋Š”๋ฐ, ์›Œํ”„๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๋ถ€ํ„ฐ ๋„ฃ์–ด์„œ... ๊ทธ ์ˆœ์„œ๋งŒ ๋ฐ”๊พธ๋‹ˆ(BFS์ฝ”๋“œ์˜ 46, 47๋ฒˆ ์ค„ ์ˆœ์„œ๋งŒ ๋ฐ”๊ฟˆ) runtime error๋Š” ํ•ด๊ฒฐ์ด ๋˜์—ˆ๊ณ  7๋ฒˆ๊ณผ 10๋ฒˆ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋งŒ ํ‹€๋ฆฌ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ ์šฉ..๐Ÿ˜ฑ

+ 200327 ๋„์ฐฉํ•˜์ง€ ๋ชปํ•˜๋Š”๊ฒฝ์šฐ -1๋กœ ์ถœ๋ ฅํ•˜๊ฒŒ ํ•˜๋‹ˆ 7๋ฒˆ ํ…Œ์ผ€ ํ•˜๋‚˜๋งŒ ํ‹€๋ฆฌ๊ฒŒ๋จ.

๊ณ„์† ์ƒ๊ฐ์„ ํ•ด๋ด๋„ ์ด์ œ๋Š” ๋” ์ด์ƒ ์•„์ด๋””์–ด๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹คใ…œ ์ผ๋‹จ ๋ธ”๋กœ๊ทธ์— ์˜ฌ๋ ค๋‘๊ณ  ๋‚˜์ค‘์— ๋‹ค์‹œ ํ’€์–ด๋ด์•ผ๊ฒ ๋‹ค.

์ฝ”๋“œ

DP : ์œ„์—์„œ ์•„๋ž˜๋กœ๋งŒ ๊ฐ€๋‹ˆ ๋งจ ์•„๋ž˜์—์„œ ๋‹ค์‹œ ์˜ฌ๋ผ์˜ค๋Š” ์ผ€์ด์Šค์—์„œ๋Š” ์‹คํŒจ.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<intint> p;
int dx[] = { 0,1,0 }, dy[] = { 1,0,-1 };
int n, arr[1005][1005], dp[1005][1005];
vector<p> warp[10];
void goWarp(int x, int y, int warpNum) {
    for (auto e : warp[warpNum]) {
        p child = e;
        int nx = child.first, ny = child.second;
        if (nx == x && ny == y) continue;
        dp[nx][ny] = dp[nx][ny] == -1 ? dp[x][y] + 1 : min(dp[nx][ny], dp[x][y] + 1);
    }
}
 
int main() {
    scanf("%d"&n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d"&arr[i][j]);
            if (arr[i][j] > 1) {
                warp[arr[i][j]].push_back({ i,j });
            }
        }
    }
    memset(dp, -1sizeof(dp));
    dp[0][0= 1;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (dp[i][j] == -1continue;
            for (int k = 0; k < 3; k++) {
                int nx = i + dx[k], ny = j + dy[k];
                if (nx < 0 || ny < 0 || nx >= n || ny >= n || (dp[nx][ny] != -1 && dp[nx][ny] <= dp[i][j])) continue;
                if (arr[nx][ny] != 1) dp[nx][ny] = dp[i][j] + 1;
                if (arr[nx][ny] > 1) goWarp(nx, ny, arr[nx][ny]);
            }
        }
        for (int j = n - 1; j >= 0; j--) {
            if (dp[i][j] == -1continue;
            for (int k = 0; k < 3; k++) {
                int nx = i + dx[k], ny = j + dy[k];
                if (nx < 0 || ny < 0 || nx >= n || ny >= n || (dp[nx][ny] != -1 && dp[nx][ny] <= dp[i][j])) continue;
                if (arr[nx][ny] != 1) dp[nx][ny] = dp[i][j] + 1;
                if (arr[nx][ny] > 1) goWarp(nx, ny, arr[nx][ny]);
            }
        }
    }
    printf("%d", dp[n - 1][n - 1]);
    return 0;
}
cs

 

BFS : int dx[] = { 0,1,0,-1 } ์ด์–ด์•ผ ํ–ˆ๋‹ค...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
typedef pair<intint> p;
int dx[] = { 0,1,0,1 }, dy[] = { 1,0,-1,0 };
int n, arr[1005][1005], chk[1005][1005], warpChk[10], ans;
vector<p> warp[10];
queue<p> q;
void warpPush(int x, int y, int warpNum) {
    warpChk[warpNum] = 1;
    for (auto e : warp[warpNum]) {
        p child = e;
        int time = chk[x][y], nx = child.first, ny = child.second;
        if (nx == x && ny == y) continue;
        chk[nx][ny] = time + 1;
        q.push({ nx, ny });
    }
}
int main() {
    scanf("%d"&n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d"&arr[i][j]);
            if (arr[i][j] > 1) {
                warp[arr[i][j]].push_back({ i,j });
            }
        }
    }
 
    chk[0][0= 1;
    q.push({ 00 });
    while (!q.empty()) {
        p front = q.front();
        q.pop();
        int x = front.first, y = front.second;
        int time = chk[x][y];
        if (x == n - 1 && y == n - 1) {
            break;
        }
        for (int k = 0; k < 4; k++) {
            int nx = x + dx[k], ny = y + dy[k];
            if (nx < 0 || ny < 0 || nx >= n || ny >= n || arr[nx][ny] == 1 || chk[nx][ny] || warpChk[arr[nx][ny]]) continue;
            chk[nx][ny] = time + 1;
            if (arr[nx][ny] > 1) { warpPush(nx, ny, arr[nx][ny]); }
            q.push({ nx, ny });
        }
    }
    printf("%d", chk[n - 1][n - 1] ? chk[n - 1][n - 1] : -1);
    return 0;
}
cs

200327 ์ถ”๊ฐ€

deque๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด๋ณด๋‹ˆ๊นŒ 80์ ๋งž์Œ.. ๋Š๋‚Œ ์ข‹์•˜๋Š”๋ฐ ๊นŒ๋น„ใ…œ

204002 ์ถ”๊ฐ€


0 1 0 0 0 
0 1 0 1 0  
0 1 0 2 0 
0 1 0 0 0  
0 0 0 2 0 

์ธ ๊ฒฝ์šฐ 11์ด ๋‚˜์™€์•ผ ํ•˜๋Š”๋ฐ 12๊ฐ€ ๋‚˜์˜ค๊ณ  ์žˆ์—ˆ์Œ.(์›Œํ”„ ์šฐ์„  ํƒ์ƒ‰ ๋•Œ๋ฌธ์—)

๊ทธ๋ž˜์„œ ์•„๋ž˜ ์กฐ๊ฑด๋ฌธ์— (chk[nx][ny] && chk[nx][ny] <= chk[x][y]) ์ด ์กฐ๊ฑด์„ ์คฌ๋”๋‹ˆ ๋‹ต์€ ๋งž์ง€๋งŒ, ์‹œ๊ฐ„์ดˆ๊ณผ๋‚ฌ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฑ์œผ๋กœ๋Š” ๋ชป ํ‘ธ๋Š” ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™๊ณ  ๊ทธ๋ƒฅ BFS ํ ์ด์šฉํ•ด์„œ ๋Œ๋ฆฌ๋Š” ๊ฒŒ ํŽธํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <vector>
#include <deque>
#include <algorithm>
using namespace std;
typedef pair<intint> p;
int dx[] = { 010,-1 }, dy[] = { 10-10 };
int arr[1005][1005], chk[1005][1005], warpChk[10];
int n;
vector<p> warp[10];
deque<p> dq;
int main() {
    scanf("%d"&n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d"&arr[i][j]);
            if (arr[i][j] > 1) {
                warp[arr[i][j]].push_back({ i, j });
            }
        }
    }
 
    chk[0][0= 1;
    dq.push_back({ 0,0 });
    while (dq.size()) {
        auto front = dq.front();
        dq.pop_front();
        int x = front.first, y = front.second;
        if (x == n - 1 && y == n - 1) {
            printf("%d", chk[x][y]);
            return 0;
        }
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i], ny = y + dy[i];
            if (nx < 0 || ny < 0 || nx >= n || ny >= n || chk[nx][ny] || arr[nx][ny] == 1continue;
            chk[nx][ny] = chk[x][y] + 1;
            if (arr[nx][ny] && !warpChk[arr[nx][ny]]) { // ์›Œํ”„์ด๊ณ  ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์›Œํ”„๋ฉด
                warpChk[arr[nx][ny]] = 1;
                for (auto child : warp[arr[nx][ny]]) {
                    int cx = child.first, cy = child.second;
                    if (cx == nx && cy == ny) continue;
                    chk[cx][cy] = chk[nx][ny] + 1;
                    dq.push_front({ cx, cy });
                }
            }
            else {
                dq.push_back({ nx, ny });
            }
        }
    }
    printf("-1");
    return 0;
}
cs

 

์„ฑ๊ณต!!

 

ํ•ด๊ฒฐ

key point, int dx[] = { 0,1,0-1 }, dy[] = { 1,0,-10 }; ์œ„์ชฝ๋„ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค!!!
  1. ์ž…๋ ฅ์„ ๋ฐ›๋‹ค๊ฐ€ ์›Œํ”„๋ฅผ ๋งŒ๋‚˜๋ฉด, ์›Œํ”„๋ฒˆํ˜ธ์— ๋งž๋Š” ํ–‰์— ์ธ์ž๋กœ ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  2. ์ดˆ๊ธฐ๊ฐ’( chk[0][0]=1, q.push({0,0}) )์„ ์„ค์ •ํ•œ๋‹ค.
  3. chk๋ฐฐ์—ด์˜ ์“ฐ์ž„์€ 
    1. ๋ฐฉ๋ฌธ์„ ํ–ˆ๋‹ค๋ฉด 1์ด์ƒ์ด๊ณ  
    2. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด 0์ด๋‹ค.
    3. chk[i][j]์˜ ๊ฐ’์€ (i, j)๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ์ตœ์†Œ์‹œ๊ฐ„์ด๋‹ค. 
  4. BFS๋ฅผ ๋ˆ๋‹ค.
  5. ํ˜„์žฌ ์œ„์น˜๋Š” x, y์ด๊ณ , ์ธ์ ‘ํ•œ ๋„ค ๋ฐฉํ–ฅ์€ nx, ny์ด๋‹ค.
  6. ์ธ์ ‘ํ•œ ๊ณณ์— ๋Œ€ํ•ด์„œ N*N ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ€๊ฑฐ๋‚˜, ๋ฒฝ์ด๊ฑฐ๋‚˜, ๋ฐฉ๋ฌธํ–ˆ๊ฑฐ๋‚˜, ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์›Œํ”„๋ผ๋ฉด ๋” ์ด์ƒ ํ™•์ธํ•˜์ง€ ์•Š๋Š”๋‹ค.
  7. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฐฉ๋ฌธ์„ ํ•ด์•ผํ•˜๋ฏ€๋กœ chk[nx][ny]์„ ํ˜„์žฌ์‹œ๊ฐ„+1๋กœ ์ €์žฅํ•œ๋‹ค.
  8. ๊ทธ๋Ÿฐ๋ฐ (nx, ny)์œ„์น˜๊ฐ€ ์›Œํ”„๋ผ๋ฉด
    1. ํ•ด๋‹น ์›Œํ”„๋ฒˆํ˜ธ์— ๋Œ€ํ•ด์„œ ๋ฐฉ๋ฌธํ–ˆ์Œ์„ ์•Œ๋ฆฌ๊ณ  → warpChk
    2. (ํ˜„์žฌ ์›Œํ”„์œ„์น˜ ์ œ์™ธ)๊ฐ™์€ ์›Œํ”„๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“  ์œ„์น˜์— ๋Œ€ํ•˜์—ฌ, ์‹œ๊ฐ„์„ ์„ค์ •ํ•˜๊ณ , ์ขŒํ‘œ๋ฅผ q์— ๋„ฃ์–ด์ค€๋‹ค.
  9.  (nx, ny)์œ„์น˜๊ฐ€ ์›Œํ”„๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ํ™•์ธํ•  ๊ฑฐ ์—†์ด q์— ๋„ฃ์–ด์ค€๋‹ค.
  10. ์œ„์˜ ์ˆœ์„œ๋ฅผ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ x๊ฐ€ n-1์ด๊ณ , y๊ฐ€ n-1์ด๋ผ๋ฉด ํƒˆ์ถœ๊ตฌ์ด๋ฏ€๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ์ข…๋ฃŒํ•˜๊ณ  ํ˜„์žฌ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.
  11. ๋งŒ์•ฝ ํƒˆ์ถœํ•  ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
typedef pair<intint> p;
int dx[] = { 0,1,0,-1 }, dy[] = { 1,0,-1,0 };
int n, arr[1005][1005], chk[1005][1005], warpChk[10];
vector<p> warp[10];
queue<p> q;
void warpPush(int x, int y, int warpNum) {
    warpChk[warpNum] = 1;
    for (auto child : warp[warpNum]) {
        int time = chk[x][y], cx = child.first, cy = child.second;
        if (cx == x && cy == y) continue;
        chk[cx][cy] = time + 1;
        q.push({ cx, cy });
    }
}
int main() {
    scanf("%d"&n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d"&arr[i][j]);
            if (arr[i][j] > 1) {
                warp[arr[i][j]].push_back({ i,j });
            }
        }
    }
    chk[0][0= 1;
    q.push({ 00 });
    while (!q.empty()) {
        p front = q.front();
        q.pop();
        int x = front.first, y = front.second;
        int time = chk[x][y];
        if (x == n - 1 && y == n - 1) {
            break;
        }
        for (int k = 0; k < 4; k++) {
            int nx = x + dx[k], ny = y + dy[k];
            if (nx < 0 || ny < 0 || nx >= n || ny >= n || arr[nx][ny] == 1 || chk[nx][ny] || warpChk[arr[nx][ny]]) continue;            
           chk[nx][ny] = time + 1;
            if (arr[nx][ny] > 1) { warpPush(nx, ny, arr[nx][ny]); }
            else q.push({ nx, ny });
        }
    }
    printf("%d", chk[n - 1][n - 1] ? chk[n - 1][n - 1] : -1);
    return 0;
}
 
cs

 

ํ›„๊ธฐ

๋”๋ณด๊ธฐ

์‹œํ–‰์ฐฉ์˜ค์˜ BFS ์ฝ”๋“œ์—์„œ dx๋งˆ์ง€๋ง‰ ์ธ์ž๋ฅผ -1๋กœ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ์„ฑ๊ณต์ด์—ˆ๋‹ค.. ์œฝ!!
DP๋กœ ๋ฐ”๊ฟ”ํ’€๋‹ค๊ฐ€ -1์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์•„์„œ ๋บ์—ˆ๋Š”๋ฐ.... dp์—๋„ ํ•„์š”ํ–ˆ๋‚˜๋ณด๋‹ค?

+ ์ˆ˜์ •ํ•ด๋ดค๋Š”๋ฐ ๊ณ„์† 7๋ฒˆ์ด ํ‹€๋ฆผ.. ๋‚˜์ค‘์— ๊ณ ์ณ์•ผ์ง€ ใ„ฑ-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<intint> p;
int dx[] = { 0,1,0,-1 }, dy[] = { 1,0,-1,0 };
int n, arr[1005][1005], dp[1005][1005], warpChk[10];
vector<p> warp[10];
 
void goWarp(int x, int y, int warpNum) {
    for (auto child : warp[warpNum]) {
        int nx = child.first, ny = child.second;
        if (nx == x && ny == y) continue;
        dp[nx][ny] = dp[nx][ny] == -1 ? dp[x][y] + 1 : min(dp[nx][ny], dp[x][y] + 1);
    }
}
int main() {
    scanf("%d"&n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d"&arr[i][j]);
            if (arr[i][j] > 1) {
                warp[arr[i][j]].push_back({ i,j });
            }
        }
    }
    memset(dp, -1sizeof(dp));
    dp[0][0= 1;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (dp[i][j] == -1continue;
            for (int k = 0; k < 4; k++) {
                int nx = i + dx[k], ny = j + dy[k];
                if (nx < 0 || ny < 0 || nx >= n || ny >= n || arr[nx][ny] == 1 || (dp[nx][ny] != -1 && dp[nx][ny] <= dp[i][j]) || warpChk[arr[nx][ny]] ) continue;
                dp[nx][ny] = dp[i][j] + 1;
                if (arr[nx][ny] > 1) goWarp(nx, ny, arr[nx][ny]);
            }
        }
        for (int j = n - 1; j >= 0; j--) {
            if (dp[i][j] == -1continue;
            for (int k = 0; k < 4; k++) {
                int nx = i + dx[k], ny = j + dy[k];
                if (nx < 0 || ny < 0 || nx >= n || ny >= n || arr[nx][ny] == 1 || (dp[nx][ny] != -1 && dp[nx][ny] <= dp[i][j]) || warpChk[arr[nx][ny]]) continue;
                dp[nx][ny] = dp[i][j] + 1;
                if (arr[nx][ny] > 1) {
                    goWarp(nx, ny, arr[nx][ny]);
                    warpChk[arr[nx][ny]] = 1;
                }
            }
        }
    }
    printf("%d", dp[n - 1][n - 1]);
    return 0;
}
 
cs

deque์œผ๋กœ ํ‘ผ ๋ฐฉ๋ฒ•์€.. ์Œ.... ์˜ฌ์น˜์•Š์€ ๋ฐฉ๋ฒ•์ธ๊ฒƒ ๊ฐ™๋‹ค!

+ 200401 ์งˆ๋ฌธ๋‚จ๊ฒจ์„œ ๋‹ต๋ณ€์„ ๋ฐ›์•˜๋Š”๋ฐ

5
0 1 0 0 0
0 1 0 1 0
0 1 0 1 0
0 1 0 1 0
0 0 0 1 0

์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์— ๋‚ด dp์ฝ”๋“œ๋กœ ํ’€์—ˆ์„ ๊ฒฝ์šฐ (4, 2)์—์„œ ๋” ์ด์ƒ ์œ„๋กœ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ -1์„ ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค.

๋‹ค์–‘ํ•œ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ ์ƒ๊ฐํ•ด๋ณผ์ค„ ์•Œ์•˜๋‹ค๋ฉด ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐํ–ˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

+ 200402 ๋ฑ๋„ ๋ฐ˜๋ก€๋ฅผ ์ฐพ์•„์„œ ์›Œํ”„๋ฅผ ์•ž์— ๋„ฃ์œผ๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ๊ทธ๋Ÿด๊ฑฐ๋ฉด ๊ทธ๋ƒฅ ํŽธํ•˜๊ฒŒ ํ๋ฅผ ์“ฐ์ž! 

๋Œ“๊ธ€