๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 16236 ์•„๊ธฐ์ƒ์–ด (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 10. 13.

<๋ฌธ์ œ ๋งํฌ>

https://www.acmicpc.net/problem/16236

 

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

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

www.acmicpc.net

 

<ํ’€์ด ์ „๋žต>

  1. ๊ตฌํ˜„ ๋ฌธ์ œ์ด๋‹ค. ๋‚˜๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ฒ˜์Œ์— ์ตœ๋Œ€ O(N^6)์˜ ์ฝ”๋“œ๋กœ pypy(1076ms)๋กœ ํ†ต๊ณผ (python ์‹œ๊ฐ„์ดˆ๊ณผ)ํ•˜๊ณ  ์ดํ›„์— jh05013๋‹˜์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ํ›จ์”ฌ ๋น ๋ฅธ ํ’€์ด(python: 288ms)๋กœ ๋‹ค์‹œ ํ’€์—ˆ๋Š”๋ฐ ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ์†Œ๊ฐœํ•ด๋ณด๊ฒ ๋‹ค.
  2. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ƒ์–ด๊ฐ€ ๋‹ค์Œ ๋จน์ด๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ •์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์—ฌ๊ธฐ์„œ '๊ฐ€์žฅ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€๊นŒ์šฐ๋ฉฐ,  ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ ์™ผ์ชฝ ์ƒ๋‹จ์— ์žˆ๋Š” ๋จน์ด'๋ฅผ ๊ณ ๋ฅด๋Š” ์กฐ๊ฑด์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊นŒ๋‹ค๋กญ๋‹ค.  
    1. ๋‚˜๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ (0, 0)๋ถ€ํ„ฐ (N-1, N-1)๊นŒ์ง€ 'ํ•ด๋‹น ์ขŒํ‘œ์˜ ๋จน์ด -> ์ƒ์–ด'๋กœ bfs ํƒ์ƒ‰์„ ํ•ด์„œ ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ๊ฐ€๊นŒ์šธ ๋•Œ๋งŒ ๋‹ค์Œ ๋จน์ด ์ •๋ณด๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๊ณ ,
    2. ๋น ๋ฅธ ํ’€์ด๊ฐ™์€ ๊ฒฝ์šฐ๋Š” '์ƒ์–ด -> ๋ชจ๋“  ๋จน์ด' ๋กœ ํ•œ๋ฒˆ์˜ bfsํƒ์ƒ‰์„ ํ•ด์„œ ๋ชจ๋“  ๋จน์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ ๋‹ค์Œ์—, ํ•ด๋‹น ๋จน์ด์˜ ๊ฑฐ๋ฆฌ์™€ ์ขŒํ‘œ๋ฅผ ๋ณ„๋„์˜ ๋ฐฐ์—ด์— ๋‹ด์•„ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ min ๊ฐ’์œผ๋กœ ๋‹ค์Œ ๋จน์ด์˜ ์ •๋ณด๋ฅผ ๊ตฌํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•  ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ -> ํ–‰ -> ์—ด ์ˆœ์œผ๋กœ ๊ตฌํ•œ ์ตœ์†Ÿ๊ฐ’์ด ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ์˜ bfsํƒ์ƒ‰์œผ๋กœ ๋๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  3. ๊ทธ ์™ธ ์ž์ž˜ํ•œ ๊ตฌํ˜„์€ ํŠน๋ณ„ํžˆ ์–ด๋ ค์šด ๊ฒŒ ์—†์–ด์„œ ์•„๋ž˜ ์ฝ”๋“œ ์ฃผ์„์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.
  4. ์ฐธ๊ณ ๋กœ ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์‚ผ์„ฑ ๊ธฐ์ถœ์ธ๋ฐ ๋‚ด๊ฐ€ ์•Œ๊ธฐ๋กœ ์‚ผ์„ฑ ์‹œํ—˜์€ 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)

๋Œ“๊ธ€