[BOJ][๐ก4][๋ฐฑ์ค#02158] ์ฐ์ ์์ ๊ฑฐ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๋คํด๋ ํ์ ์ฐ์ ์์ ๊ฑฐ ํ๊ธฐ๋ฅผ ์ฆ๊ธด๋ค. ๋คํด๋ ์ค๋ ์๊ฐ๋์ ์ด๋์ ํ๋ ๊ฒ๋ ์ข์ํ์ง๋ง, ๋๋ก๋ ๋๋๋ก ์งง์ ์๊ฐ๋์ ์ฐ์ ์์ ๊ฑฐ ํ๊ธฐ๋ฅผ ๋ง์น๊ธฐ๋ฅผ ์ํ๊ธฐ๋ ํ๋ค. ์ฐ์ ๋ชจ์ต์ R(1 โค R โค 100)ํ C(1 โค C โค 100)์ด์ ํ๋ ฌ๋ก ํํ๋๋ค. ํ๋ ฌ์ ๊ฐ ์๋ ๊ทธ ์์น์ ๋์ด(๊ณ ๋)๋ฅผ ๋ํ๋ธ๋ค. ๋คํด๋ ํ์ฌ ํ๋ ฌ์ (1, 1) ์์น์ ์๊ณ , (R, C) ์์น๋ก ์ด๋ํ๋ ค ํ๋ค. ๋คํด์ (1, 1)์์น์์์ ์ด๊ธฐ ์๋๋ V(1 โค V โค 1,000,000)์ด๋ค. ํ๋ ฌ์์์ ์์ง์์ ์, ์๋, ์ผ์ชฝ, ์ค๋ฅธ์ชฝ์ ๋ค ๋ฐฉํฅ์ผ๋ก๋ง ๊ฐ๋ฅํ๋ค๊ณ ํ์. ์๋๊ฐ V๋ผ๋ ์๋ฏธ๋ ๋จ์์๊ฐ๋์ V์นธ์ ์์ง์ผ ์ ์๋ค๋ ์๋ฏธ์ด๋ค. ์์ ๊ฑฐ๋ฅผ ํ๊ณ ์ด๋ํ๋ค๋ณด๋ฉด ๋์ด ์ฐจ์ด์ ์ํด ์๋๊ฐ ๊ฐ์๋๊ธฐ๋ ํ๊ณ ๊ฐ์๋๊ธฐ๋ ํ๋ค. ํ์ฌ ์์น์ ๋์ด๊ฐ A์ด๊ณ , ์ด๋ํ๋ ค๋ ์์น์ ๋์ด๊ฐ B์ผ ๋, ์๋๋ ๋ฐฐ๊ฐ ๋๋ค(2A-Bย ๋ฐฐ). ์ค์ ๋ก๋ ์ด๋ํ๋ ๋์ค์ ์๋๊ฐ ๋ณํ๊ฒ ๋์ง๋ง, ๋ฌธ์ ์ ํธ์๋ฅผ ์ํด์ ์ด๋์ ์์ ํ ๋ง์น ํ์ ์๋๊ฐ ๋ณํ๋ ๊ฒ์ผ๋ก ์๊ฐํ์. ์ฆ, ์ด๋์ ํ ๋์๋ ์ฒ์์ ์๋๋ฅผ ๊ฐ์ง๊ณ ์ด๋ํ๋ ๊ฒ์ผ๋ก ํ๋ค. ์ฐ์ ๋์ด์ ๋ํ ์ ๋ณด์ ์ด๊ธฐ ์๋๊ฐ ์ฃผ์ด์ก์ ๋, (1, 1)์ ์์น์์ (R, C)์ ์์น๋ก ์ด๋ํ ๋ ํ์ํ ์ต์ ์๊ฐ์ ๊ตฌํด๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ธ ์ ์ V, R, C๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ R๊ฐ์ ์ค์๋ C๊ฐ์ ์ ์๋ก ํ๋ ฌ์ด ์ฃผ์ด์ง๋ค. ํ๋ ฌ์ ๊ฐ ์๋ -25 ์ด์ 25 ์ดํ์ ์ ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ด๋์ ํ์ํ ์ต์ ์๊ฐ์ ์ถ๋ ฅํ๋ค. ์ ๋/์๋ ์ค์ฐจ๋ 10-2๊น์ง ํ์ฉํ๋ค.
์์
์ ๋ ฅ
1 2 3
2 1 2
9 9 1
์ถ๋ ฅ
2.50
My Sol
import sys
input = sys.stdin.readline
from collections import deque
V, I, J = map(int, input().split())
mat = [list(map(int, input().split())) for _ in range(I)]
time = [[float('inf')]*J for _ in range(I)]
time[0][0] = 0
Q = deque()
Q.append((0, 0, V))
while Q:
ni, nj, speed = Q.popleft()
for di, dj in ((-1,0),(1,0),(0,1),(0,-1)):
si, sj = ni+di, nj+dj
if not (0<=si<I and 0<=sj<J): continue
if time[si][sj] <= time[ni][nj] + (1/speed): continue
time[si][sj] = time[ni][nj] + (1/speed)
speed_new = speed * (2**(mat[ni][nj]-mat[si][sj]))
Q.append((si, sj, speed_new))
print(f'{time[I-1][J-1]:.2f}')
deque๋ฅผ ์ด์ฉํด ์ฌ๋ฐฉ์ time์ ํ์ธํ๊ณ , ๋ง์ฝ ํด๋น ์ขํ๊น์ง ๋๋ฌํ๋ ์ต๋จ ์๊ฐ์ ๊ฐฑ์ ํ ์ ์๋ค๋ฉด ์ด๋ฅผ ๊ฐฑ์ ํ๊ณ ๊ณ์ฐ๋ ๊ธฐ์ค์ ๊ณผ ์๋๋ฅผ Q์ ๋ฃ์ด ์๋ก์ด ๊ธฐ์ค์ ์ผ๋ก ์ผ๋๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
from heapq import heappush, heappop
v, r, c = map(int, input().split())
li = [list(map(int, input().split())) for _ in range(r)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
heap = []
heappush(heap, (0, 0, 0, v)) # time_spent, x, y, velocity
time_spents = [[float('inf')] * c for _ in range(r)]
time_spents[0][0] = 0
while heap:
time_spent, x, y, velocity = heappop(heap)
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or nx >= r or ny < 0 or ny >= c:
continue
n_time_spent = time_spent + 1 / velocity
if n_time_spent < time_spents[nx][ny]:
time_spents[nx][ny] = n_time_spent
nvelocity = velocity * (2 ** (li[x][y] - li[nx][ny]))
heappush(heap, (n_time_spent, nx, ny, nvelocity))
print(time_spents[-1][-1])
๊ฑฐ์ 10๋ฐฐ์ ๊ฐ๊น๊ฒ ์ฐ์ฐ์๊ฐ์ด ์งง์ ํ์ด๊ฐ ์์ด์ ๊ฐ์ ธ์ ๋ถ์ํด๋ณด๋ ค ํ๋ค. ๋ฐฉ์์ ๋์ฒ๋ผ time์ ๋ํ 2์ฐจ์ ๋ฐฐ์ด์ inf๋ฅผ ๋ฃ์ด ๊ฐฑ์ ํ๋ ๋ฐฉ์์ด๋ค. ๋๋ ๋ค๋ฅธ ๊ฒ์ ๋๋ deque๋ฅผ ์ฌ์ฉํ๊ณ , ์ด ๋ถ์ heap์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ธ๋ฐ, visit ์ฒดํฌ๋ฅผ ํ๋ ๊ฒ๋ ์๋๋ฐ ์ ์ด๋ ๊ฒ ์ฐ์ฐ์๊ฐ ์ฐจ์ด๊ฐ ๋๋์ง ์ ์๊ฐ ์๋ค.
heap์ ์ ๋ ฌ์ ์ต์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋๋๋ฐ, time ๋ฐฐ์ด์ ๋ฐ๋ก ๋ง๋ค์ด ์ฒดํฌํด์ฃผ๋ ๋ถ๋ถ๋ ๋น์ทํ๋ฐ, ์ ์๊ฐ์ด ์ด๋ ๊ฒ ์ฐจ์ด๊ฐ ๋ ๊น. ์ด์ฉ๋ฉด if๋ฌธ์ ํต๊ณผํ์ง ์์ ์ ๊ณฑ ์ฐ์ฐ์ด๋ heap์ ๋ค์ด๊ฐ๋ ์์ ์ฐจ์ด๊ฐ ๋์์ผ ๊ฒ ๊ฐ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ