본문 바로가기
알고리즘

[백준/파이썬] #17836

by 룰루루 2025. 5. 20.

오랜만에 답을 안 보고 30분 안에 풀었다. BFS와 heap을 사용해서 풀었다. 

import heapq

INF = 1e9

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

def direct_path(end_x, end_y):
    start_x, start_y = 0, 0
    visited = [[False] * M for _ in range(N)]
    visited[start_x][start_y] = True
    heap = []
    heapq.heappush(heap, (0, start_x, start_y))
    while heap:
        dist, cur_x, cur_y = heapq.heappop(heap)
        if cur_x == end_x and cur_y == end_y:
            return dist
        
        for k in range(4):
            nx, ny = cur_x + dx[k], cur_y + dy[k]
            if nx < 0 or nx >= N or ny < 0 or ny >= M:
                continue
            if not visited[nx][ny] and graph[nx][ny] != 1:
                heapq.heappush(heap, (dist+1, nx, ny))
                visited[nx][ny] = True

    return INF


if __name__ == "__main__":
    N, M, T = map(int, input().split())
    graph = []
    gram_x, gram_y = 0, 0
    for i in range(N):
        lst = list(map(int, input().split()))
        graph.append(lst)
        if 2 in lst:
            gram_x, gram_y = i, lst.index(2)

    dist_princess = direct_path(N-1, M-1)
    dist_gram = direct_path(gram_x, gram_y)
    gram_to_princess = (N-1-gram_x) + (M-1-gram_y)

    if dist_princess == INF and dist_gram == INF:
        print("Fail")
    else:
        answer = min(dist_princess, dist_gram + gram_to_princess)
        if answer <= T:
            print(answer)
        else:
            print("Fail")

 

'알고리즘' 카테고리의 다른 글

[백준/파이썬] #2469  (0) 2025.05.18
[백준/파이썬] #21608  (0) 2025.05.15
[백준/파이썬] #16927  (0) 2025.05.11
[백준/파이썬] #2011  (0) 2025.05.08
[백준/파이썬] #1062  (0) 2025.05.05