본문 바로가기
언어

티켓으로 여행 경로 만들기: BFS

by 땅호720 2024. 2. 16.

<제한사항>

  • 모든 공항은 알파벳 대문자 3글자로 이루어집니다.
  • 주어진 공항 수는 3개 이상 10,000개 이하입니다.
  • tickets의 각 행 [a, b]는 a 공항에서 b 공항으로 가는 항공권이 있다는 의미입니다.
  • 주어진 항공권은 모두 사용해야 합니다.
  • 만일 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return 합니다.
  • 모든 도시를 방문할 수 없는 경우는 주어지지 않습니다.
from collections import deque
 
def solution(tickets):
    answer = []
    graph = dict() # 출발 공항: 도착 가능한 공항
 
    # 방문 가능한 공항 그래프 생성
    for d, a in tickets:
        graph[d] = graph.get(d, []) + [a]   # key=d에 아무것도 없으면 list 반환
 
    data = deque() # (출발 공항, 방문한 경로 list, 남은 티켓)
    data.append(("ICN", ["ICN"], tickets.copy()))   # 초기값
    
    while data:
        departure, path, ticket = data.popleft()
 
        if not ticket: # 주어진 티켓을 모두 사용한 경우
            answer.append(path)
        else:
            if departure not in graph.keys(): # 갈 수 있는 공항이 없는 경우
                # ["ICN", "ATL"], ["ICN", "SFO"]일 때, 최종 목적지가 SFO로 가야하는데 
                # SFO가 먼저 처리될 경우 continue를 이용하여 ATL로 접근
                continue

            for arrival in graph[departure]:
                if [departure, arrival] in ticket: # 가는 항공권이 있는 경우
                    nextTicket = ticket.copy()
                    nextTicket.remove([departure, arrival]) # ticket 사용
                    data.append((arrival, path + [arrival], nextTicket))
    
    return sorted(answer)[0]

'언어' 카테고리의 다른 글

체육복 여분이 있어도 도난을 당하다니  (0) 2024.02.22
ct 정리  (0) 2024.02.21
단어 변환 최소 스텝: BFS  (0) 2024.02.16
네트워크 덩어리 세기: DFS  (0) 2024.02.16
target으로 계산되는 경우의 수 구하기: DFS  (0) 2024.02.16