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

[BOJ] #16236 ์•„๊ธฐ ์ƒ์–ด

by dar0m! 2019. 10. 11.
์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ •๋‹ต ๋น„์œจ
2 ์ดˆ 512 MB 36.088%

 

 

16236๋ฒˆ: ์•„๊ธฐ ์ƒ์–ด

N×N ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์— ๋ฌผ๊ณ ๊ธฐ M๋งˆ๋ฆฌ์™€ ์•„๊ธฐ ์ƒ์–ด 1๋งˆ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๊ณต๊ฐ„์€ 1×1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ํ•œ ์นธ์—๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 1๋งˆ๋ฆฌ ์กด์žฌํ•œ๋‹ค. ์•„๊ธฐ ์ƒ์–ด์™€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋ชจ๋‘ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ด ํฌ๊ธฐ๋Š” ์ž์—ฐ์ˆ˜์ด๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ์— ์•„๊ธฐ ์ƒ์–ด์˜ ํฌ๊ธฐ๋Š” 2์ด๊ณ , ์•„๊ธฐ ์ƒ์–ด๋Š” 1์ดˆ์— ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ํ•œ ์นธ์”ฉ ์ด๋™ํ•œ๋‹ค. ์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ณ , ๋‚˜๋จธ์ง€ ์นธ์€ ๋ชจ๋‘ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ

www.acmicpc.net

 

๋ฌธ์ œ

์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋จน์ด ์ค‘ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์— ์žˆ๋Š” ๋จน์ด๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๋จน์–ด์•ผ ํ•œ๋‹ค. ์ด ๋•Œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์˜ ๋จน์ด๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด ๊ฐ€์žฅ ์œ„์ชฝ์— ์žˆ๋Š” ๋จน์ด๋ฅผ ๋จน๊ณ , ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์ด๋ฉด์„œ ์œ„์ชฝ์— ์žˆ๋Š” ๋จน์ด๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๋จน์ด๋ฅผ ํƒํ•œ๋‹ค.

 

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

'๊ฐ€์žฅ ์œ„์ชฝ, ๊ฐ€์žฅ ์™ผ์ชฝ' ์ด๋ผ๋Š” ๋ง์ด ์‚ฌ์‹ค ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์› ๋Š”๋ฐ ์ดํ•ดํ•˜๊ณ  ๋‚˜๋ฉด ํ—ˆ๋ฌดํ•œ ์–˜๊ธฐ์˜€๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ์œ„์ชฝ๊ณผ ์™ผ์ชฝ์„ ๋œปํ•œ ๋‹จ์–ด๋กœ, ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ผ ๋•Œ x์ขŒํ‘œ๊ฐ€ ์ž‘์€ ์ˆœ์„œ๋ฅผ ์šฐ์„ ์œผ๋กœ, x์ขŒํ‘œ๊ฐ€ ๊ฐ™๊ณ  ์ตœ๋‹จ๊ฑฐ๋ฆฌ์ธ ๋จน์ด๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด y์ขŒํ‘œ๊ฐ€ ์ž‘์€ ๋จน์ด๋ฅผ ์šฐ์„ ์œผ๋กœ ๋จน๋Š”๋‹ค๋Š” ๋œป์ด๋‹ค.

์ƒ์–ด์˜ ์œ„์น˜๋ฅผ pair ์Œ์œผ๋กœ ์ €์žฅํ•ด ๋‘์–ด ๋งค ๋ฒˆ ๊ฐ€์žฅ ์งง์€ ๊ฑฐ๋ฆฌ์— ์žˆ๋Š” ๋จน์ด๋ฅผ ์ฐพ์œผ๋Ÿฌ bfs๋ฅผ ๋Œ๋ฆฌ๊ฒŒ ๋œ๋‹ค. bfs ๋ฅผ ๋Œ๋ฆฌ๋ฉด์„œ chk๋ผ๋Š” ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๋ฐฐ์—ด์€ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ์ฒดํฌํ•จ๊ณผ ๋™์‹œ์— ๋ฐฉ๋ฌธํ–ˆ์„ ๋‹น์‹œ์˜ ์‹œ๊ฐ„์„ ์ €์žฅํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋จน์ด๋“ค์„ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๋จน์„์ˆ˜ ์žˆ๊ณ , ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ผ๋ฉด Min(์•„๊ธฐ ์ƒ์–ด์™€ ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋จน์ด์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ)๊ณผ Min_p(์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋จน์ด ์ขŒํ‘œ)๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค. ์ƒ์–ด์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ์ด๋ฏธ ํƒ์ƒ‰ํ•œ ์œ„์น˜๋ผ๋ฉด ๋„˜์–ด๊ฐ€๊ณ , ์ƒ์–ด์™€ ํฌ๊ธฐ๊ฐ€ ๊ฐ™์€ ๋จน์ด๋Š” ์ง€๋‚˜๊ฐˆ ์ˆ˜๋งŒ ์žˆ์œผ๋ฏ€๋กœ ๊ฐฑ์‹ ํ•  ํ•„์š” ์—†์ด ๋‹ค์Œ๋ฒˆ ํƒ์ƒ‰์„ ์œ„ํ•ด ํ์— ๋„ฃ๋Š”๋‹ค.

bfs๋ฅผ ๋๋‚ด๊ณ  ๋‚˜๋ฉด ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ์˜ ๋จน์ด๋ฅผ ์ฐพ์•„๋‚ธ ๊ฒƒ์ด๋ฏ€๋กœ ์ƒ์–ด์˜ ์œ„์น˜์™€ ์ดˆ๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค. ๋งŒ์•ฝ bfs๊ฐ€ ๋๋‚  ๋•Œ ๊นŒ์ง€ ์ฐพ์•„๋‚ธ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ์—†๋‹ค๋ฉด ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์ฒญํ•ด์•ผํ•˜๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„
1992 KB 4 ms
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
57
58
59
60
61
62
63
64
65
66
67
68
#include<iostream>
#include<string.h>
#include<queue>
#define inf 1e9
#define F(x, y, u, p) for(int x = 0; x<u; x++)for(int y = 0; y<p; y++)
using namespace std;
typedef pair<intint> p;
int n, arr[25][25], chk[25][25], shark_size = 2, Min, cnt, ans;
int dx[] = { 0,1,0,-1 }, dy[] = { 1,0,-1,0 };
p shark, Min_p;
void bfs(int x, int y) {
    queue<p> q;
    q.push({ x, y });
    chk[x][y] = 0;
    while (!q.empty()) {
        int r = q.front().first, c = q.front().second;
        q.pop();
 
        for (int i = 0; i < 4; i++) {
            int nr = r + dx[i], nc = c + dy[i];
            if (nr < 0 || nr >= n || nc < 0 || nc >= n) continue;
            if (arr[nr][nc] > shark_size || chk[nr][nc] >= 0continue;
            
            chk[nr][nc] = chk[r][c] + 1;
            if (arr[nr][nc] && arr[nr][nc] < shark_size) {
                if (Min > chk[nr][nc]) {
                    Min = chk[nr][nc];
                    Min_p.first = nr; Min_p.second = nc;
                }
                else if (Min == chk[nr][nc]) {
                    if (Min_p.first > nr || (Min_p.first == nr && Min_p.second > nc)) {
                        Min_p.first = nr; Min_p.second = nc;
                    }
                }                
            }
            q.push({ nr, nc });
        }
    }
}
int main() {
    scanf("%d"&n);
    F(i, j, n, n) {
        scanf("%d"&arr[i][j]);
        if (arr[i][j] == 9) {
            shark = { i,j }; arr[i][j] = 0;
        }
    }
    while (1) {
        Min = Min_p.first = Min_p.second = inf;
        memset(chk, -1sizeof(chk));
 
        bfs(shark.first, shark.second);
 
        if (Min == inf) break;
        ans += Min;
        shark = { Min_p.first, Min_p.second };
        arr[Min_p.first][Min_p.second] = 0;
 
        cnt++;
        if (cnt == shark_size) {
            shark_size++;
            cnt = 0;
        }
    }
    printf("%d", ans);
 
    return 0;
}
cs

 

๋Œ“๊ธ€