여행경로

Eunseo·2022년 5월 2일
0

Programmers

목록 보기
4/9
post-thumbnail

여행경로 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/43164

Summary
DFS/BFS를 사용하여 해결하는 문제


Description

주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "ICN" 공항에서 출발합니다.

항공권 정보가 담긴 2차원 배열 tickets가 매개변수로 주어질 때, 방문하는 공항 경로를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

[제한사항]

  • 모든 공항은 알파벳 대문자 3글자로 이루어집니다.
  • 주어진 공항 수는 3개 이상 10,000개 이하입니다.
  • tickets의 각 행 [a, b]는 a 공항에서 b 공항으로 가는 항공권이 있다는 의미입니다.
  • 주어진 항공권은 모두 사용해야 합니다.
  • 만일 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return 합니다.
  • 모든 도시를 방문할 수 없는 경우는 주어지지 않습니다.

[입출력 예]

ticketsreturn
[["ICN", "JFK"], ["HND", "IAD"], ["JFK", "HND"]]["ICN", "JFK", "HND", "IAD"]
[["ICN", "SFO"], ["ICN", "ATL"], ["SFO", "ATL"], ["ATL", "ICN"], ["ATL","SFO"]]["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"]

Checking List

  • 혼자서 문제를 해결
  • 힌트를 보고 해결
  • 답을 보고 해결

My Answer

  • 답을 보고 해결했다.
  • 정확성 : 통과
def solution(tickets):
    route = {}
    for ap in tickets:
        start, end = ap[0],ap[1]
        route[start] = sorted(route.get(start,[]) + [end], reverse=True)
        
    answer = []
    stack = ['ICN']
    while stack :
        start = stack[-1]
        if not start in route or route[start] == []:
            answer.append(stack.pop())
        else:
            stack.append(route[start].pop(-1))
    return answer[::-1]

Answer Sheet

  • DFS 활용
from collections import defaultdict
def solution(tickets):
    # 특정 티켓의 인접 리스트를 구하는 함수
    def init_graph():
        routes = defaultdict(list)
        for key, value in tickets:
            routes[key].append(value)
        return routes

    # 스택을 사용한 DFS
    def dfs():
        stack = ["ICN"]
        path = []  # 가려고하는 경로를 저장하는 변수
        while len(stack) > 0:  # stack이 비어있을 때까지
            top = stack[-1]
            # 특정 공항에서 출발하는 표가 없다면 또는 있지만 티켓을 다 써버린 경우
            if top not in routes or len(routes[top]) == 0:
                path.append(stack.pop())
            else:
                stack.append(routes[top].pop(0))
        return path[::-1]

    routes = init_graph()
    for r in routes:
        routes[r].sort()

    answer = dfs()
    return answer

출처: 링크


Trial & Error

  • 모든 공항을 탐색하기 전에 경로가 끝나버리는 상황을 고려하지 못해 헤맸다.

  • 결국 답을 보고 나서야 깨닫고 이해하는 시간을 가졌다.


Takeaway

  • 해당 노드에 방문했는지 따로 체크를 안해줘도 경로를 역순으로 저장해주면 완전 탐색을 구현할 수 있다는 것을 배울 수 있었다.

  • 문제 별로 유연하게 개념을 적용하는 연습이 필요하다.


profile
내가 공부한 것들

0개의 댓글