728x90
반응형
문제 설명
주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "ICN" 공항에서 출발합니다.
항공권 정보가 담긴 2차원 배열 tickets가 매개변수로 주어질 때, 방문하는 공항 경로를 배열에 담아 return 하도록 solution 함수를 작성해주세요.
#제한사항
- 모든 공항은 알파벳 대문자 3글자로 이루어집니다.
- 주어진 공항 수는 3개 이상 10,000개 이하입니다.
- ticktets의 각 행 [a,b]는 a공항에서 b공항으로 가는 항공권이 있다는 의미입니다.
- 주어진 항공권은 모두 사용해야 합나다.
- 만일 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return합니다.
- 모든 도시를 방문할 수 없는 경우는 주어지지 않습니다.
#입출력 예
- 3번째 테스트 케이스는 반례를 위해 따로 추가했다. 이게 포인트라고 생각함.
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"] |
[["ICN", "D"], ["D", "ICN"], ["ICN", "B"]] |
["ICN", "D", "ICN", "B"] |
#입출력 예 설명
- 예제 #1
["ICN", "JFK", "HND", "IAD"] 순으로 방문할 수 있습니다.
- 예제 #2
["ICN", "SFO", "ATL", "ICN", "ATL", "SFO"] 순으로 방문할 수도 있지만 ["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"] 가 알파벳 순으로 앞섭니다.
풀이 코드
모든 경로를 탐색해야 하는 경우니까 DFS 선택
## 1. solution 함수
- 각 티켓의 도착지를 알파벳으로 오름차순으로 정렬함 => sort(key=lambda x:x[1])
- 출발지를 "ICN"으로 두고 dfs 돌리기
from collections import deque
routes = []
def solution(tickets):
answer = []
tickets.sort(key=lambda x:x[1]) # 티켓의 도착지 기준 알파벳 정렬
visited = [False] * len(tickets)
#routes.append("ICN")
dfs(visited, "ICN", "ICN", tickets)
answer = list(map(str,routes[0].split()))
return answer
## 2. dfs 함수
- dfs 종료 조건: 모든 티켓을 사용했을 때
- for문
- 각 티켓 아직 사용 안했고, 티켓의 출발지가 start와 일치하면
- => 그 티켓의 도착지를 출발지로 설정해 dfs 다시 돌린다.
- visited[i] = False => 테스트케이스#3을 위한 것
- tickets = [["ICN", "D"], ["D", "ICN"], ["ICN", "B"]]
- return = ["ICN", "D", "ICN", "B"] 이어야 할 때
- 알파벳 순으로 정렬하면 [ICN, B] 먼저 사용하게 되지만, B가 출발지인 티켓이 없다. 이 때 dfs는 더 깊이 탐색하지 못하고 돌아오게 된다. 즉, 해당 티켓을 다시 내려놓는 경우가 생김. 이 경우를 대비해서 dfs() 재귀호출 밑에 추가해두는 것 !!!
- 각 티켓 아직 사용 안했고, 티켓의 출발지가 start와 일치하면
def dfs(visited, start, route, tickets):
#print(f"start {start}")
if False not in visited:
routes.append(route)
return
for i in range(len(tickets)):
#print(f"about {tickets[i]}")
if visited[i] == False and tickets[i][0] == start:
visited[i] = True
#route.append(tickets[i][1])
#print(route+" "+tickets[i][1])
dfs(visited, tickets[i][1], route+" "+tickets[i][1], tickets)
visited[i] = False #POINT
전체 코드
from collections import deque
## DFS ##
def solution(tickets):
answer = []
tickets.sort(key=lambda x:x[1]) # 티켓의 도착지 기준 알파벳 정렬
visited = [False] * len(tickets)
#routes.append("ICN")
dfs(visited, "ICN", "ICN", tickets)
answer = list(map(str,routes[0].split()))
return answer
routes = []
def dfs(visited, start, route, tickets):
#print(f"start {start}")
if False not in visited:
routes.append(route)
return
for i in range(len(tickets)):
#print(f"about {tickets[i]}")
if visited[i] == False and tickets[i][0] == start:
visited[i] = True
#route.append(tickets[i][1])
#print(route+" "+tickets[i][1])
dfs(visited, tickets[i][1], route+" "+tickets[i][1], tickets)
visited[i] = False #POINT
728x90
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Python] 알고리즘고득점Kit-정렬-가장 큰 수 (0) | 2024.10.12 |
---|---|
[프로그래머스/Python] 알고리즘고득점Kit-스택/큐-같은숫자는 싫어 (1) | 2024.10.12 |
[프로그래머스]위클리챌린지1주차-부족한 금액 계산하기 (2) | 2021.08.03 |
[프로그래머스]숫자문자열과영단어-Python3 (6) | 2021.07.30 |
[프로그래머스]정수내림차순구하기-Python3 (2) | 2021.07.29 |