본문 바로가기

알고리즘 문제풀이

소가 길을 건너간 이유7 (백준14461)

내가 생각한 풀이인데 예제는 통과하지만 시간 초과가 난다. 그래서 다른 사람의 풀이를 보고 풀어보았다. 

import sys 
from heapq import heapify, heappop, heappush 
input = sys.stdin.readline 
n,t = map(int, input().split())
inf = int(1e9)

dx = [1,-1,0,0] 
dy = [0,0,1,-1]
dist = [[inf for i in range(n)]for j in range(n)]
# print(dist)
gra = [list(map(int ,input().split())) for i in range(n)]

def find(a,b) :
    q = []
    # cnt = 0 
    # cost = 0 
    q.append((0,0,a,b))
    heapify(q)
    dist[a][b] = 0 
    while q :
        cost,cnt ,x,y=heappop(q)
        if dist[x][y] <cost :
            continue 
        cnt += 1 
        flag = 0 
        if cnt %3==0  :
            flag = 1 
        if x == n-1 and y==n-1 :
            return 0 
            
        for i in range(4):
            
            nx, ny = x+dx[i] , y+dy[i]
            if(0<= nx <n and 0<=ny< n):
                
                nextcost=( (cost+ gra[nx][ny]+t)if flag else (cost+t))
                if dist[nx][ny] >nextcost :
                    
                    dist[nx][ny] = nextcost 
                heappush(q, ( nextcost,cnt, nx,ny))
                
                
               
                
                
        
    
find(0,0)
print(dist[n-1][n-1])

3번 이동 시 위치할 수 있는 좌표를 찾아서 경로 탐색을 완료한다. 이후, 마지막 칸에서 가까운 위치에서 다시 최솟값을 계산한다. 

import sys
import queue
input = sys.stdin.readline

# 3회 이동 시 가능한 상대 좌표
# 상하좌우 / 체스 나이트 / 3칸 상하좌우
dx = [1,-1,0,0, 2,2,-2,-2,1,-1,1,-1, 3,-3,0,0]
dy = [0,0,1,-1, 1,-1,1,-1,2,2,-2,-2, 0,0,3,-3]

def f():   
  dist = [[float('inf')]*N for _ in range(N)]
  dist[0][0] = 0
  pq = queue.PriorityQueue()
  pq.put([0, 0, 0]) # dist, x, y

  # 3칸 단위 다익스트라
  while(not pq.empty()):
    d, x, y = pq.get()
    for k in range(16):
      nx, ny = x + dx[k], y + dy[k]        

      if(0<=nx<=N-1 and 0<=ny<=N-1):        
        nd = d + 3*T + grid[nx][ny]
        if(dist[nx][ny] > nd):
          dist[nx][ny] = nd
          pq.put([nd,nx,ny])
                       
  # 마지막 칸에서 2회 이내로 도달 가능한 범위에서 최솟값을 구한다.      
  return min(
    dist[-1][-1],
    dist[-2][-1] + T, dist[-1][-2],
    dist[-3][-1] + 2*T, dist[-2][-2] + 2*T, dist[-1][-3] + 2*T
  )


if __name__ == '__main__':
  N, T = map(int, input().split())
  grid = [list(map(int, input().split())) for _ in range(N)]    
                                 
  print(f())

'알고리즘 문제풀이' 카테고리의 다른 글

Apple Delivery(백준 5944)  (0) 2023.08.25
Bronze Cow Party(백준 6248)  (0) 2023.08.25
UCPC는 무엇의 약자일까? (백준 15904)  (0) 2023.08.24
방탈출(백준 23743)  (0) 2023.08.22
복제 로봇(백준 1944)  (0) 2023.08.21