๋์ด๋ | ์ ๋ต๋ฅ |
โ โ โ | -% |
ํ๋ฆฌ๋ฏธ์ ์๊ณ ๋ฆฌ์ฆ ์ํด๋ฆฌ ๋นํ์๊ณ ์์ฆ3 3์ฃผ์ฐจ
๋ฌธ์
๊ฒฉ์ํ ์์ 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<int, int> 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 = 1; break;
}
}
if (!flg) {
tarr[x][y] = 1;
nq.push({ x, y });
}
}
ans++;
cq = nq;
nq = q;
memcpy(arr, tarr, sizeof(arr));
memset(tarr, 0, sizeof(tarr));
}
printf("%d", ans);
}
else {
printf("-1");
}
return 0;
}
|
cs |
ํด๊ฒฐ
key point,
1. queue์ ์ขํ์ ํจ๊ป ์๊ฐ์ ์ ์ฅํด๋๋ฉด queueํ๋๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
2. ๋ฐฉ๋ฌธํ์์ ์ฒดํฌํ๋ chk๋ฐฐ์ด์ ์ฌ์ฉํ๋ฉด ๋งค๋ฒ ๋ฐฐ์ด์ ๋ณต์ฌํ์ง ์์๋ ๋๋ค.
3. ๊ฒฉ์ํ์ด ๋ชจ๋ 0์ผ๋ก ์ฑ์์ง ๊ฒฝ์ฐ, BFS๊ฐ ์งํ๋์ง ์์์ผ๋ฏ๋ก ์ ์ต์ ๋ ์ฌ๋ผ์ง ์ ์๋ค.
→ -1์ ์ถ๋ ฅํ๋ 0์ ์ถ๋ ฅํ๋ ์ ๋ต...(๋ฌธ์ ๊ฐ ๋ชจํธํจ)
- ์ ๋ ฅ์ ๋ฐ์ ๋ ์ ์ต์ ๊ฐ ์๋ค๋ฉด q์ ์๊ฐ๊ณผ ์ ์ต์ ์ ์ขํ๋ฅผ ์ ์ฅํ๋ค.
- ๋ง์ฝ q์ ํฌ๊ธฐ๊ฐ ๋ฐฐ์ด ํฌ๊ธฐ์ ๊ฐ๊ฑฐ๋ q๊ฐ ๋น์ด์๋ค๋ฉด ์ ์ต์ ๊ฐ ์ฌ๋ผ์ง ์ ์๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก ๋ฐ๋ก -1 ์ถ๋ ฅ.
- ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ BFS๋ก ํ์ธ.
- q๊ฐ ๋น์ด์ง ๋ ๊น์ง ๋ฐ๋ณตํ ๋, ํด๋น ์ ์ต์ ์์น๋ฅผ x, y๋ก ๋ณด๊ณ ํ์ฌ ์๊ฐ์ d๋ผ๊ณ ํ๋ฉด
- ์ ๋ต์ ์ต๋์ธ d๊ฐ์ด ๋๋ค.
- ์ ์ต์ ์ ์ธ์ ํ ์์น์ ๋น ๊ณต๊ฐ(0)์ด ์๋ค๋ฉด chk๋ฐฐ์ด์ ํ์ฌ ์๊ฐ(d)์ ์ ์ฅํ๊ณ ์ธ๋ฑ์ค ๊ฐ์ 0์ผ๋ก ๊ฐฑ์ ํ๋ค.
- ์ ์ต์ ์ ์ธ์ ํ ์์น์ ๋น ๊ณต๊ฐ์ด ํ๋๋ผ๋ ์์๋ค๋ฉด, flg๋ 0์ด๋ฉฐ ์ด ๋ q์ ํ์ฌ์๊ฐ+1(d+1)๊ณผ ์ขํ๋ฅผ ํจ๊ป ๋ฃ์ด์ค๋ค.
- ์ ์ต์ ์ ์ธ์ ํ ์์น๋ฅผ ํ์ํ ๋ ๋ฐฐ์ด๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋, ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์์น์ ์๊ฐ์ด ํ์ฌ ์๊ฐ๊ณผ ๊ฐ๋ค๋ฉด ๋์ด๊ฐ๋ค.
์ด๋ ๊ฒ ๋ชจ๋ 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<int, int> 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 = 1; break;
}
}
if (!flg)q.push({ d + 1, { x, y } });
}
printf("%d", ans ? ans : -1);
return 0;
}
|
cs |
ํ๊ธฐ
ํด์ค์ ๋ณด๊ณ ๋ ํ ๊น๋ํ๊ฒ ๊ณ ์น ์ ์์์ง๋ง ์ ์ ๋ฌธ์ ๋ฅผ ๋ช ๋ฒ์ด๊ณ ํ๋ ธ๋ ์ด์ ๋,
์ ์ต์ ๊ฐ ์ฌ๋ผ์ง ์ ์๋ ๊ฒฝ์ฐ์ผ ๋ -1์ ์ถ๋ ฅํด์ผํ๋ ๊ฒ์ ๋ง๊ฐํ๊ณ ๋ฌธ์ ๋ฅผ ํ์๊ธฐ ๋๋ฌธ์ด๋ค;; ใ ใ ใ ใ
๋ฌธ์ ๋ฅผ ์ ์ฝ๊ณ ํ์!!
'๐ฅ PS(Problem Solving) ๐ฅ > goorm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ตฌ๋ฆLEVEL] ๋ฏธ๋ก์ฐพ๊ธฐ (0) | 2020.03.24 |
---|---|
[๊ตฌ๋ฆLEVEL] ๋ณ๋ค์ ์ ์ (0) | 2020.03.24 |
[๊ตฌ๋ฆLEVEL] ๋ฐฑ์ (0) | 2020.03.23 |
[๊ตฌ๋ฆLEVEL] Dance Dance Revolution (0) | 2020.03.23 |
[๊ตฌ๋ฆLEVEL] ๊ฒฝํ ์ถ์ฒจ (0) | 2020.03.23 |
๋๊ธ