문제

 

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

 

프로그래머스

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

programmers.co.kr

문제 설명

주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "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"] 가 알파벳 순으로 앞섭니다.

 

 

문제풀이 코드

from collections import defaultdict
def solution(tickets):
tickets_dict = defaultdict(list)
result = []
# 공항에서 출발하여 도착할 수 있는 모든 도착지를 딕셔너리 형태로 관리
for start, end in tickets:
tickets_dict[start].append(end)
# 방문 순서는 알파벳 순으로 하기때문에 정렬해준다
for key in tickets_dict.keys():
tickets_dict[key].sort()
def dfs(start):
while tickets_dict[start]:
end = tickets_dict[start].pop(0)
dfs(end)
# 출발지에서 더이상 갈곳이 없을 때 결과에 넣어준다.
# 방문 순서가 역순으로 쌓임
if not tickets_dict[start]:
result.append(start)
dfs("ICN")
return result[::-1]

1. 출발지에서 갈 수 있는 모든 도착지를 딕셔너리 형태로 만든다.

2. 출발지에서 갈 수 있는 모든 도착지를 정렬한다. (방문은 알파벳순으로 해야된다.)

3. 출발지에서 갈 수 있는 모든 도착지를 순서대로 재귀호출한다.

4. 출발지에서 더 이상 갈 수 있는곳이 없다면 결과에 추가해준다.

5. 출발은 "ICN"에서 하니까 dfs("ICN")으로 호출한다.

6. 도착지가 없는 곳 부터 결과에 들어오기 때문에 result를 뒤집어서 반환한다.

+ Recent posts