프로그래머스 여행경로(python)

박노정·2021년 6월 28일
1

알린이의 알고리즘

목록 보기
12/15

https://programmers.co.kr/learn/courses/30/lessons/43164?language=python3

주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "ICN" 공항에서 출발합니다.
항공권 정보가 담긴 2차원 배열 tickets가 매개변수로 주어질 때, 방문하는 공항 경로를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

초기 코드

이 코드를 짤때 도착지에서 출발하는 노선들을 정렬하고 이름이 빠른걸 탑승하는 방식으로 코드를 짰다.
하지만 4개의 테케 중 두개를 통과하지 못했는데 그 이유는 이렇게 갈 경우 모든 티켓을 소모할 수 없기 때문이다.

from collections import deque

def solution(tickets):
    answer = []
    q = deque()
    q.append("ICN")
    while q:
        target = q.popleft()
        answer.append(target)
        target_list = []
        for i in range(len(tickets)):
            departure, arrival = tickets[i]
            if target == departure:
                target_list.append([arrival,i])
        target_list.sort(key=lambda x : x[0])
        if target_list:
            arrival, i = target_list.pop(0)
            tickets.pop(i)
            q.append(arrival)

    return answer

통과 코드

그래서 비슷한 로직이지만 예외처리를 해줄 수 있는 코드를 완성했다.
스택을 쌓고 길이없으면 하나씩 되돌아가는 코드이다.

예외처리를 하기위해 쓴 티켓을 어떻게 표시하지 생각하다가 딕셔너리로 처리해주는 코드를 발견하고서는 적용해보았다. 출처

def solution(tickets):
    
    routes = dict()
    for i in tickets:
        if i[0] in routes:
            routes[i[0]].append(i[1])
        else:
            routes[i[0]] = [i[1]]
            
    for i in routes.keys():
        routes[i].sort(reverse = True)
        
    answer = []
    start = ["ICN"]
    
    while start:
        target = start[-1]  
        if target not in routes or len(routes[target]) == 0:
            answer.append(start.pop())
        else:
            start.append(routes[target].pop())
            
    return answer[::-1]
profile
성장스택 쌓고있는 개발자🏋

0개의 댓글