파이썬으로 표현한 다익스트라 알고리즘 코드 예시가 이해가 안되서 질문드립니다.

조회수 767회

이미지

//여기에 코드를 입력하세요
graph = {}
graph["start"] = {}
graph["start"]["a"] = 6
graph["start"]["b"] = 2
graph["a"] = {"fin": 1} # graph["a"]["fin"] = 1
graph["b"] = {"a": 3, "fin": 5} # graph["b"]["a"] = 3   graph["b"]["fin"] = 5
graph["fin"] = {}

# 노드의 가격을 저장하는 해시테이블
infinity = float("inf") # 파이썬에서 무한 표현 방법은 float('inf') 를 사용한다.
costs = {}
costs["a"] = 6
costs["b"] = 2
costs["fin"] = infinity

# 부모를 위한 해시테이블
parents = {}
parents["a"] = "start"
parents["b"] = "start"
parents["fin"] = None

processed = [] # 각 노드는 한번씩만 처리해야하므로 이미 처리한 노드를 기록해놓을 리스트가 필요하다.

# 가장 싼 노드를 찾는 함수
def find_lowest_cost_node(costs):
    lowest_cost = float("inf")
    lowest_cost_node = None

    for node in costs: # 비용 테이블에서 노드를 하나씩 돌면서
        cost = costs[node] 
        if cost < lowest_cost and node not in processed: # 확인중인 노드의 비용이 최저 비용보다 낮고 그 노드가 처리되지 않은 노드일 때
            lowest_cost = cost # 최저 비용 갱신
            lowest_cost_node = node # 최저 비용 노드 갱신

    return lowest_cost_node


node = find_lowest_cost_node(costs) # 아직 처리하지 않은 가장 싼 노드를 찾는다.
# 모든 노드를 처리하면 반복문 종료
while node is not None: 
    cost = costs[node]
    neighbors = graph[node] # node = 'a' -> {'fin' : 1} node = 'b' -> {'a' : 3, 'fin' : 5} node = 'fin' -> {}

    for n in neighbors.keys(): # 모든 이웃에 대해 반복
        new_cost = cost + neighbors[n]

        if costs[n] > new_cost: # 새 노드를 지나는 것이 가격이 더 싸다면
            costs[n] = new_cost # 노드의 가격을 새 노드의 가격으로 갱신
            parents[n] = node # 부모를 이 노드로 새로 설정

    processed.append(node) # 노드를 처리한 사실을 기록
    node = find_lowest_cost_node(costs) # 다음으로 처리할 노드를 찾아 반복

위 코드에서,

  1. while문 안에서 초기에 선언된 변수 neighbors에 저장된 원소를 나열한다면 어떻게 되죠? 일단, graph[node]를 대입했으니 node = 'a' -> {'fin' : 1} node = 'b' -> {'a' : 3, 'fin' : 5} node = 'fin' -> {} 이런식인건 알겠는데 제대로 나타낸다면 어떻게 할지 모르겠습니다 ㅠ

  2. while문 안의 for문 for n in neighbors.keys()이 n이 a, b ,fin이 된다는 얘기인가요?

  3. neighbors[a], neighbors[b], neighbors[fin]이 무슨값이죠?

  4. find_lowest_cost_node(costs) 함수에서 처음에 lowest_cost 를 float("inf") (무한대)로 초기화하는 이유가 뭐죠? 그리고, lowest_cost_node 를 None으로 초기화하는 이유가 뭐죠?

  5. while문 바로 전에 node = find_lowest_cost_node(costs)라고 선언했는데, while문 안의 마지막에 왜 node = find_lowest_cost_node(costs)를 또 선언하는 이유가 뭐죠?

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)