Algorithm/Programmers

[프로그래머스 Level 3] 여행경로(Python)

씨주 2024. 1. 23. 17:38

📝 Level 3. 여행경로

더보기

📌 문제 설명

 

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

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

 

📌 제한사항

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

📌 입출력 예

tickets return
[["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"]

📌 입출력 예 설명

예제 #1
["ICN", "JFK", "HND", "IAD"] 순으로 방문할 수 있습니다.

예제 #2
["ICN", "SFO", "ATL", "ICN", "ATL", "SFO"] 순으로 방문할 수도 있지만 ["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"] 가 알파벳 순으로 앞섭니다.

 

✏️ 나의 풀이 (BFS 이용)

from collections import deque

def solution(tickets):
    tickets.sort()
    q = deque()
    q.append(['ICN', ['ICN'], []])
    visit = []

    while q:
        start, answer, visited = q.popleft()
        if len(visited) == len(tickets):
            visit.append(answer)
        
        for idx, ticket in enumerate(tickets):
            if idx not in visited and start == ticket[0]:
                q.append([ticket[1], answer+[ticket[1]], visited+[idx]])
    visit.sort()
    return visit[0]
  • 가능한 경로가 2개일 경우 알파벳 순으로 간다고 해서 tickets를 sort했는데 오류가 뜬다.. 다른분의 풀이를 참고해본 결과 모든 경로를 visit list에 담은 후 sort하면 0번째 경로로 return하면 정답처리 된다. (이유를 모르겠다..)

 

from collections import deque

def solution(tickets):
    tickets.sort()
    q = deque()
    q.append(['ICN', ['ICN'], []])

    while q:
        start, answer, visited = q.popleft()
        if len(visited) == len(tickets):
            return answer
        
        for ticket in tickets:
            if ticket not in visited and start == ticket[0]:
                q.append([ticket[1], answer+[ticket[1]], visited+[ticket]])
  • 위의 코드에서 모든 경로를 저장한 visit가 없을 때 코드(오답코드) ㅠ
    이렇게 제출했을 때 테스트케이스1 에서 오답이 뜬다. 다른분들 글을 봤을 때도 테스트케이스1 때문에 오답이 많이 나오는 것 같은데 이 문제는 나중에 한번 더 확인해봐야겠다!

 

✏️ 다른 풀이(dict, stack 이용)

def solution(tickets):
    answer = []

    routes = {}
    for (start, end) in tickets:
        routes[start] = routes.get(start, []) + [end]

    for r in routes.keys():
        routes[r].sort(reverse = True)

    stack = ["ICN"]
    while stack:
        top = stack[-1]
        if (top not in routes) or (not routes[top]):
            answer.append(stack.pop())  
        else:
            stack.append(routes[top].pop())

    return answer[::-1]
  • tickets list를 dict로 한번 정리하고 deque가 아닌 stack을 이용한다. BFS문제를 stack으로도 풀 수 있다는게 특이했다.

 

https://school.programmers.co.kr/learn/courses/30/lessons/43164

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr