[프로그래머스] 여행경로
2022. 2. 1. 16:13ㆍPython/코딩 문제
# 문제 설명
주어진 항공권 티겟들을 모두 이용하여, 방문하는 공항 경로를 반환해라. 첫 공항은 항상 "ICN"에서 출발한다.
모든 항공은 알파벳 대문자 3글자로 이루어지며, 만일 가능한 경로가 2개 이상이라면 알파벳 순서가 앞서는 경로를 반환한다.
항공권 티겟 정보 [a, b]는 a 공항에서 b 공항으로 가는 항공권이 있다는 것을 의미한다.
# 입출력 예시
입력 | 출력 |
[["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"] |
# 코드 풀이
def solution(tickets):
n = len(tickets)
answer = []
def dfs(s, path, nexts):
if len(path) > n: # 티켓소진하면
answer.append(path)
return
avail = [b for a,b in nexts if a==s] # 시작이 같은 티겟들
if not avail:
return
for d in sorted(avail):
path.append(d) # 맨처음에 현재노드 방문 안하고, 다음노드를 방문
nexts.remove([s, d])
dfs(d, path[:], nexts[:])
path.pop()
nexts.append([s, d])
dfs("ICN", ["ICN"], tickets)
return answer[0] # 알파벳 순서가 앞서는 것을 반환
# 핵심 포인트
- 현재 항공에서 다음으로 갈 항공을 고르는 경우이므로, DFS 그래프 알고리즘을 푼다.
- 거쳐온 경로 path와 남은 티겟들 nexts는 반드시 값을 복사하여 탐색해야 한다.
- for문에서 재귀호출로 다른 경로를 탐색해나가는 경우에는, 이전 선택에 영향을 받지 않도록 해야한다.
반응형
'Python > 코딩 문제' 카테고리의 다른 글
[리트코드] 46. Permutations (0) | 2022.02.01 |
---|---|
[프로그래머스] 위장 (0) | 2022.02.01 |
[리트코드] 328. Odd Even Linked List (0) | 2022.01.18 |
[리트코드] 24. Swap Nodes in Pairs (0) | 2022.01.18 |
[리트코드] 2. Add Two Numbers (0) | 2022.01.16 |