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

[๊ตฌ๋ฆ„LEVEL] ์ œ์Šต์ œ

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


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

 

goorm

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

www.goorm.io

๋ฌธ์ œ

๊ฒฉ์žํŒ ์œ„์˜ 1์€ ์ œ์Šต์ œ๋ฅผ, 0์€ ๋นˆ ๊ณต๊ฐ„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋นˆ ๊ณต๊ฐ„์— ๋งž๋‹ฟ์•„ ์žˆ๋Š” ์ œ์Šต์ œ๋Š” 1์ดˆ ํ›„ ์Šต๊ธฐ๋ฅผ ํก์ˆ˜ํ•˜๊ณ  ์‚ฌ๋ผ์ง„๋‹ค. ์œ„์˜ ๊ฒฉ์žํŒ์ด 1์ดˆ๊ฐ€ ์ง€๋‚˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ์–‘์ด ๋œ๋‹ค.

์ œ์Šต์ œ๊ฐ€ ๋ฐฐ์น˜๋œ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ชจ๋“  ์ œ์Šต์ œ๊ฐ€ ์‚ฌ๋ผ์ง€๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๊ตฌํ•ด๋ณด์ž!

๋ชจ๋“  ์ œ์Šต์ œ๊ฐ€ ์‚ฌ๋ผ์ง€๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ์ œ์Šต์ œ๊ฐ€ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

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

1. ๋ฐฐ์—ด์„ ์ผ์ผ์ด ๋ณต์‚ฌํ–ˆ๋‹ค.

  • arr๊ณผ tarr๋ฐฐ์—ด์„ ๊ฐ๊ฐ ๋งŒ๋“ค์—ˆ๊ณ  arr์„ ๊ธฐ์ค€์œผ๋กœ ๊ทธ ๋‹ค์Œ ์‹œ๊ฐ„์ผ ๋•Œ ๋ฐฐ์—ด์ƒํƒœ๋ฅผ tarr์— ์ €์žฅํ•ด๋‘๊ณ 
  • tarr๊ฐ’์„ arr์— ๋ฎ์–ด์“ด๋‹ค.
  • tarr์„ ์ดˆ๊ธฐํ™”์‹œํ‚จ๋‹ค.

๐Ÿ‘‰ ๋ฐฉ๋ฌธํ–ˆ์Œ์„ ์ฒดํฌํ•˜๋Š” chk๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งค๋ฒˆ ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

2. queue๋„ ์ผ์ผ์ด ๋ณต์‚ฌํ–ˆ๋‹ค.

  • cq(current queue)์™€ (next queue)nq, q(๋น„์–ด์žˆ๋Š” queue)๊ฐ€ ์žˆ๋‹ค.
  • cq์— ์ž…๋ ฅ๋ฐ›์„ ๋‹น์‹œ ์ œ์Šต์ œ ์œ„์น˜๋ฅผ ์ €์žฅํ•ด ๋‘์—ˆ๊ณ 
  • cq๋ฅผ ํ™•์ธํ•˜๋ฉด์„œ cq์— ์žˆ๋Š” ์ œ์Šต์ œ ์ฃผ๋ณ€์— 0์„ ๋ชป๋งŒ๋‚˜์„œ ๋‹ค์Œ ์‹œ๊ฐ„์—๋„ ํ™•์ธํ•ด์•ผํ•œ๋‹ค๋ฉด
  • nq์— ๋„ฃ์–ด์ค€๋‹ค.
  • cq๋ฅผ ๋ชจ๋‘ ํ™•์ธํ–ˆ๋‹ค๋ฉด nq์˜ ๋‚ด์šฉ์„ cq์— ๋ฎ์–ด์“ด๋‹ค. (cq = nq, =์—ฐ์‚ฐ์ž๋กœ ๊ฐ€๋Šฅ)
  • nq๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ๋•Œ ๋น„์–ด์žˆ๋Š” queue๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (nq = q)

๐Ÿ‘‰ queue์— ์ขŒํ‘œ์™€ ํ•จ๊ป˜ ์‹œ๊ฐ„์„ ์ €์žฅํ•ด๋‘๋ฉด queueํ•˜๋‚˜๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ์ถœ๋ ฅ์กฐ๊ฑด์„ ๊นŠ๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค.

  • if๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ
  • ๋งŒ์•ฝ ์ฒ˜์Œ ์ œ์Šต๊ธฐ ์œ„์น˜๋ฅผ ์ €์žฅํ•ด๋‘” cq์˜ ํฌ๊ธฐ๊ฐ€ n*n์ธ ๋ฐฐ์—ด ํฌ๊ธฐ์™€ ๊ฐ™๋‹ค๋ฉด
  • ์ œ์Šต์ œ๊ฐ€ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ 0์„ ์ถœ๋ ฅํ–ˆ๋‹ค.

๐Ÿ‘‰ ์ด ๊ฒฝ์šฐ๋Š” ์ œ์Šต์ œ๊ฐ€ ์—†์„ ๋•Œ 0์„ ์ถœ๋ ฅํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™์•„์„œ ์ด๋ ‡๊ฒŒ ๋ฌถ์—ˆ๋Š”๋ฐ, ์‚ฌ์‹ค์ƒ ๋ชจ๋“  ๋ฐฐ์—ด์ด 0์ด๋“  1์ด๋“  ์ œ์Šต์ œ๊ฐ€ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์ด๊ธฐ ๋•Œ๋ฌธ์— -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
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
typedef pair<intint> p;
int dx[] = { 0,0,1,-1 }, dy[] = { 1,-1,0,0, };
int n, ans;
int arr[1005][1005], tarr[1005][1005];
queue<p> cq, nq;
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]) {
                cq.push({ i, j });
            }
        }
    }
    if (cq.size() != n * n) {
        queue<p> q;
        while (1) {
            int cnt = 0;
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (arr[i][j])break;
                    else cnt++;
                }
            }
            if (cnt == n * n) break;
 
            while (!cq.empty()) {
                p front = cq.front();
                cq.pop();
                int x = front.first, y = front.second;
                int flg = 0;
                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) continue;
                    if (!arr[nx][ny]) {
                        flg = 1break;
                    }
                }
                if (!flg) {
                    tarr[x][y] = 1;
                    nq.push({ x, y });
                }
            }
            ans++;
            cq = nq;
            nq = q;
            memcpy(arr, tarr, sizeof(arr));
            memset(tarr, 0sizeof(tarr));
        }
        printf("%d", ans);
    }
    else {
        printf("-1");
    }
    return 0;
}
cs

 

ํ•ด๊ฒฐ

key point,
1. queue์— ์ขŒํ‘œ์™€ ํ•จ๊ป˜ ์‹œ๊ฐ„์„ ์ €์žฅํ•ด๋‘๋ฉด queueํ•˜๋‚˜๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
2. ๋ฐฉ๋ฌธํ–ˆ์Œ์„ ์ฒดํฌํ•˜๋Š” chk๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งค๋ฒˆ ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
3. ๊ฒฉ์žํŒ์ด ๋ชจ๋‘ 0์œผ๋กœ ์ฑ„์›Œ์ง„ ๊ฒฝ์šฐ, BFS๊ฐ€ ์ง„ํ–‰๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ œ์Šต์ œ๋Š” ์‚ฌ๋ผ์งˆ ์ˆ˜ ์—†๋‹ค.
  → -1์„ ์ถœ๋ ฅํ•˜๋“  0์„ ์ถœ๋ ฅํ•˜๋“  ์ •๋‹ต...(๋ฌธ์ œ๊ฐ€ ๋ชจํ˜ธํ•จ)
  1. ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ ์ œ์Šต์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด q์— ์‹œ๊ฐ„๊ณผ ์ œ์Šต์ œ์˜ ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  2. ๋งŒ์•ฝ q์˜ ํฌ๊ธฐ๊ฐ€ ๋ฐฐ์—ด ํฌ๊ธฐ์™€ ๊ฐ™๊ฑฐ๋‚˜ q๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด ์ œ์Šต์ œ๊ฐ€ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ ๋ฐ”๋กœ -1 ์ถœ๋ ฅ.
  3. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” BFS๋กœ ํ™•์ธ.
  4. q๊ฐ€ ๋น„์–ด์งˆ ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณตํ•  ๋•Œ, ํ•ด๋‹น ์ œ์Šต์ œ ์œ„์น˜๋ฅผ x, y๋กœ ๋ณด๊ณ  ํ˜„์žฌ ์‹œ๊ฐ„์„ d๋ผ๊ณ  ํ•˜๋ฉด
  5. ์ •๋‹ต์€ ์ตœ๋Œ€์ธ d๊ฐ’์ด ๋œ๋‹ค.
  6. ์ œ์Šต์ œ์˜ ์ธ์ ‘ํ•œ ์œ„์น˜์— ๋นˆ ๊ณต๊ฐ„(0)์ด ์žˆ๋‹ค๋ฉด chk๋ฐฐ์—ด์— ํ˜„์žฌ ์‹œ๊ฐ„(d)์„ ์ €์žฅํ•˜๊ณ  ์ธ๋ฑ์Šค ๊ฐ’์„ 0์œผ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.
  7. ์ œ์Šต์ œ์˜ ์ธ์ ‘ํ•œ ์œ„์น˜์— ๋นˆ ๊ณต๊ฐ„์ด ํ•˜๋‚˜๋ผ๋„ ์—†์—ˆ๋‹ค๋ฉด, flg๋Š” 0์ด๋ฉฐ ์ด ๋•Œ q์— ํ˜„์žฌ์‹œ๊ฐ„+1(d+1)๊ณผ ์ขŒํ‘œ๋ฅผ ํ•จ๊ป˜ ๋„ฃ์–ด์ค€๋‹ค.
  8. ์ œ์Šต์ œ์˜ ์ธ์ ‘ํ•œ ์œ„์น˜๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ ๋ฐฐ์—ด๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜, ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์œ„์น˜์˜ ์‹œ๊ฐ์ด ํ˜„์žฌ ์‹œ๊ฐ๊ณผ ๊ฐ™๋‹ค๋ฉด ๋„˜์–ด๊ฐ„๋‹ค.

์ด๋ ‡๊ฒŒ ๋ชจ๋“  q๊ฐ€ ๋น„์–ด์งˆ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉด ๋ชจ๋“  ๊ฒฉ์žํŒ์€ 0์ด ๋˜๊ณ , ์ด ๋•Œ ans์„ ์ถœ๋ ฅํ•˜๋ฉด ์ •๋‹ต์ด๋‹ค.

์ฝ”๋“œ

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
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
typedef pair<intint> p;
int dx[] = { 0,0,1,-1 }, dy[] = { 1,-1,0,0, };
int n, ans;
int arr[1005][1005], chk[1005][1005];
queue<pair<int, p>> q;
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]) q.push({ 1, { i, j } });
        }
    }
    while (!q.empty() && q.size() != n*n) {
        pair<int, p> front = q.front();
        q.pop();
        int d = front.first, x = front.second.first, y = front.second.second;
        ans = max(ans, d);
        int flg = 0;
        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 || chk[nx][ny] == d) continue;
            if (!arr[nx][ny]) {
                chk[x][y] = d;
                arr[x][y] = 0; flg = 1break;
            }
        }
        if (!flg)q.push({ d + 1, { x, y } });
    }    
    printf("%d", ans ? ans : -1);
    return 0;
}
cs

 

ํ›„๊ธฐ

ํ•ด์„ค์„ ๋ณด๊ณ ๋‚œ ํ›„ ๊น”๋”ํ•˜๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ์ •์ž‘ ๋ฌธ์ œ๋ฅผ ๋ช‡ ๋ฒˆ์ด๊ณ  ํ‹€๋ ธ๋˜ ์ด์œ ๋Š”,

์ œ์Šต์ œ๊ฐ€ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์ผ ๋•Œ -1์„ ์ถœ๋ ฅํ•ด์•ผํ•˜๋Š” ๊ฒƒ์„ ๋ง๊ฐํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค;; ใ…‹ใ…‹ใ…‹ใ…‹

๋ฌธ์ œ๋ฅผ ์ž˜ ์ฝ๊ณ  ํ’€์ž!!

๋Œ“๊ธ€