<๋ฌธ์ ๋งํฌ>
https://www.acmicpc.net/problem/16236
16236๋ฒ: ์๊ธฐ ์์ด
N×N ํฌ๊ธฐ์ ๊ณต๊ฐ์ ๋ฌผ๊ณ ๊ธฐ M๋ง๋ฆฌ์ ์๊ธฐ ์์ด 1๋ง๋ฆฌ๊ฐ ์๋ค. ๊ณต๊ฐ์ 1×1 ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ํ ์นธ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์ต๋ 1๋ง๋ฆฌ ์กด์ฌํ๋ค. ์๊ธฐ ์์ด์ ๋ฌผ๊ณ ๊ธฐ๋ ๋ชจ๋ ํฌ๊ธฐ๋ฅผ ๊ฐ
www.acmicpc.net
<ํ์ด ์ ๋ต>
- ๊ตฌํ ๋ฌธ์ ์ด๋ค. ๋๊ฐ์ ๊ฒฝ์ฐ๋ ์ฒ์์ ์ต๋ O(N^6)์ ์ฝ๋๋ก pypy(1076ms)๋ก ํต๊ณผ (python ์๊ฐ์ด๊ณผ)ํ๊ณ ์ดํ์ jh05013๋์ ํ์ด๋ฅผ ์ฐธ๊ณ ํ์ฌ ํจ์ฌ ๋น ๋ฅธ ํ์ด(python: 288ms)๋ก ๋ค์ ํ์๋๋ฐ ๋ ๊ฐ์ง ๋ชจ๋ ์๊ฐํด๋ณด๊ฒ ๋ค.
- ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์์ด๊ฐ ๋ค์ ๋จน์ด๋ฅผ ์ฐพ์๊ฐ๋ ๊ณผ์ ์ ๊ตฌํํ๋ ๊ฒ์ธ๋ฐ, ์ฌ๊ธฐ์ '๊ฐ์ฅ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น์ฐ๋ฉฐ, ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ ์ผ์ชฝ ์๋จ์ ์๋ ๋จน์ด'๋ฅผ ๊ณ ๋ฅด๋ ์กฐ๊ฑด์ ๊ตฌํํ๋ ๊ฒ์ด ๊น๋ค๋กญ๋ค.
- ๋๊ฐ์ ๊ฒฝ์ฐ๋ ์ฃผ์ด์ง ๋ฐฐ์ด์ (0, 0)๋ถํฐ (N-1, N-1)๊น์ง 'ํด๋น ์ขํ์ ๋จน์ด -> ์์ด'๋ก bfs ํ์์ ํด์ ๊ฑฐ๋ฆฌ๊ฐ ๋ ๊ฐ๊น์ธ ๋๋ง ๋ค์ ๋จน์ด ์ ๋ณด๋ฅผ ๊ฐฑ์ ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ,
- ๋น ๋ฅธ ํ์ด๊ฐ์ ๊ฒฝ์ฐ๋ '์์ด -> ๋ชจ๋ ๋จน์ด' ๋ก ํ๋ฒ์ bfsํ์์ ํด์ ๋ชจ๋ ๋จน์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๋ค์์, ํด๋น ๋จน์ด์ ๊ฑฐ๋ฆฌ์ ์ขํ๋ฅผ ๋ณ๋์ ๋ฐฐ์ด์ ๋ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก min ๊ฐ์ผ๋ก ๋ค์ ๋จน์ด์ ์ ๋ณด๋ฅผ ๊ตฌํ๋ค. ์ด๋ ๊ฒ ํ ๊ฒฝ์ฐ ๊ฑฐ๋ฆฌ -> ํ -> ์ด ์์ผ๋ก ๊ตฌํ ์ต์๊ฐ์ด ๋์ค๊ธฐ ๋๋ฌธ์ ํ๋ฒ์ bfsํ์์ผ๋ก ๋๋ผ ์ ์๋ค.
- ๊ทธ ์ธ ์์ํ ๊ตฌํ์ ํน๋ณํ ์ด๋ ค์ด ๊ฒ ์์ด์ ์๋ ์ฝ๋ ์ฃผ์์ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.
- ์ฐธ๊ณ ๋ก ํด๋น ๋ฌธ์ ๋ ์ผ์ฑ ๊ธฐ์ถ์ธ๋ฐ ๋ด๊ฐ ์๊ธฐ๋ก ์ผ์ฑ ์ํ์ pypy๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ธ ๋ฌด์ํ๊ฒ ์ฒซ๋ฒ์งธ ํ์ด๋ก ํด๋ ํต๊ณผ๋ ๋ฌธ์ ์๋ค.
<์ ๋ต์ฝ๋>
* ๋น ๋ฅธ ํ์ด
import sys, os, io, atexit
input = lambda: sys.stdin.readline().rstrip('\r\n')
stdout = io.BytesIO()
sys.stdout.write = lambda s: stdout.write(s.encode("ascii"))
atexit.register(lambda: os.write(1, stdout.getvalue()))
from collections import deque
# ๋ธํ ํ์ ๋ฐฉํฅ ์ค์
dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]
# ์๊ธฐ ์์ด ๋จน์ด ๊ฑฐ๋ฆฌ ํ์ bfs
def bfs(shark_r, shark_c):
# visited: ๋ฐฉ๋ฌธ์ฌ๋ถ & ๋จน์ด๊น์ง์ ๊ฑฐ๋ฆฌ ํ์ํ ๋ฐฐ์ด
visited = [[inf for _ in range(N)] for _ in range(N)]
visited[shark_r][shark_c] = 0
queue = deque()
queue.append((shark_r, shark_c))
while queue:
r, c = queue.popleft()
for i in range(4):
nr = r + dr[i]
nc = c + dc[i]
# ์กฐ๊ฑด ๋ง์ผ๋ฉด ๊ฑฐ๋ฆฌ ํ์ํ๋ฉด์ ํ์
if 0 <= nr < N and 0 <= nc < N and visited[nr][nc] == inf:
# ๋จน์ด๊ฐ ์์ด์ ํ์ฌ ํฌ๊ธฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ
if arr[nr][nc] <= shark:
visited[nr][nc] = visited[r][c] + 1
queue.append((nr, nc))
# result: ๋จน์ ์ ์๋ ๋จน์ด๊น์ง์ ๊ฑฐ๋ฆฌ์ ์ขํ (์ข
๋ฃ ์กฐ๊ฑด์ ์ํด ํฐ ๊ฐ์ ์ด๊ธฐํ)
result = [(inf, inf, inf)]
# ๋จน์ ์ ์๋ ๋จน์ด (์์ด ํ์ฌ ํฌ๊ธฐ๋ณด๋ค ์์) ๊ฑฐ๋ฆฌ์ ์ขํ ๋ด์์ฃผ๊ธฐ
for r in range(N):
for c in range(N):
if 0 < arr[r][c] < shark:
result.append((visited[r][c], r, c))
# ๊ฑฐ๋ฆฌ๊ฐ ์ต์์ด๋ฉด์ ์ขํ๊ฐ ์ผ์ชฝ ์์ธ ๋จน์ด์ ์ ๋ณด ๋ฐํ
return min(result)
# N: ๋ฐฐ์ด ํฌ๊ธฐ, arr: ๋ฐฐ์ด ์ ๋ณด
N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
# ์๊ธฐ ์์ด ์์น ์ฐพ์์ฃผ๊ธฐ ๋ฐ ํ์์ ์ํ ์ขํ ์ด๊ธฐํ
for r in range(N):
for c in range(N):
if arr[r][c] == 9:
shark_r, shark_c = r, c
arr[r][c] = 0
inf = float('INF')
# shark: ์์ด ํ์ฌ ํฌ๊ธฐ, size_cnt: ๋จน์ ๋จน์ด ๊ฐ์
shark = 2
size_cnt = 0
# ans: ์์ด ์ด๋ ์๊ฐ
ans = 0
while True:
# ๋ค์ ๋จน์ด ์ ๋ณด ์ฐพ์์ฃผ๊ธฐ
time, next_r, next_c = bfs(shark_r, shark_c)
# ๋จน์ด๊ฐ ์์ผ๋ฉด ์ค๋จ
if time == inf:
break
# ๋จน์ด ๋จน๊ธฐ ๋ฐ ํด๋น ์ขํ๋ก ์์ด ์ด๋
arr[next_r][next_c] = 0
shark_r, shark_c = next_r, next_c
# ์ ๋ต ๋ํด์ฃผ๊ธฐ
ans += time
# ๋จน์ด ๋จน์ ๊ฐ์ ์ธ์ฃผ๊ธฐ
size_cnt += 1
# ์์ด ํฌ๊ธฐ ์ปค์ง๋ ๊ฒฝ์ฐ
if size_cnt == shark:
shark += 1
size_cnt = 0
# ์ ๋ต ์ถ๋ ฅ
print(ans)
* ๋๋ฆฐ ํ์ด
from collections import deque
import sys, os, io, atexit
input = lambda: sys.stdin.readline().rstrip('\r\n')
stdout = io.BytesIO()
sys.stdout.write = lambda s: stdout.write(s.encode("ascii"))
atexit.register(lambda: os.write(1, stdout.getvalue()))
# 221012 16236 ์๊ธฐ์์ด
# ์ ๋ต์ฝ๋
def bfs(r, c):
visited = [[0 for _ in range(N)] for _ in range(N)]
visited[r][c] = 1
queue = deque()
queue.append((r, c))
while queue:
r, c = queue.popleft()
for i in range(4):
nr = r + dr[i]
nc = c + dc[i]
if 0 <= nr < N and 0 <= nc < N:
if visited[nr][nc] == 0:
if arr[nr][nc] == 9:
return visited[r][c]
if arr[nr][nc] <= shark:
visited[nr][nc] = visited[r][c] + 1
queue.append((nr, nc))
return float('inf')
N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
for r in range(N):
for c in range(N):
if arr[r][c] == 9:
shark_r, shark_c = r, c
shark = 2
size_cnt = 0
dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]
ans = 0
while True:
distance = float('inf')
for r in range(N):
for c in range(N):
if 0 < arr[r][c] < shark:
if bfs(r, c) < distance:
next_r, next_c = r, c
distance = bfs(r, c)
if distance == float('inf'):
break
arr[shark_r][shark_c] = 0
arr[next_r][next_c] = 9
shark_r, shark_c = next_r, next_c
ans += distance
size_cnt += 1
if size_cnt == shark:
shark += 1
size_cnt = 0
print(ans)
'โญ Problem_Solving > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2252 ์ค ์ธ์ฐ๊ธฐ (Python/ํ์ด์ฌ) (0) | 2022.10.15 |
---|---|
[๋ฐฑ์ค] 17471 ๊ฒ๋ฆฌ๋งจ๋๋ง (Python/ํ์ด์ฌ) (0) | 2022.10.14 |
[๋ฐฑ์ค] 12100 2048 (Easy) (Python/ํ์ด์ฌ) (1) | 2022.10.11 |
[๋ฐฑ์ค] 18405 ๊ฒฝ์์ ์ ์ผ (Python/ํ์ด์ฌ) (0) | 2022.10.10 |
[๋ฐฑ์ค] 17142 ์ฐ๊ตฌ์ 3 (Python/ํ์ด์ฌ) (1) | 2022.10.07 |
๋๊ธ