주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "ICN" 공항에서 출발합니다.
항공권 정보가 담긴 2차원 배열 tickets가 매개변수로 주어질 때, 방문하는 공항 경로를 배열에 담아 return 하도록 solution 함수를 작성해주세요.
| 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"] 가 알파벳 순으로 앞섭니다.
💡 문제풀이 과정
DFS로 풀이tickets.length + 1 개의 도시를 방문하게 된다. 여행 경로는 다음과 같다, 처음 출발하는 공항 + 도착지이면서 동시에 출발지 + 도착지이면서 동시에 출발지 + ... + 도착지이면서 동시에 출발지 + 최종 도착하는 공항tickets의 길이만큼 초기값 false로 채워진 visited 배열을 만든다. (해당 인덱스가 false인 항목은 아직 사용하지 않은 티켓을 의미한다.)dfs 함수 내에서 반복문을 돌면서 routes.length가 tickets.length + 1과 같아진다면 모든 항공권을 사용하여 여행경로를 짰다는 의미가 되며 이제까지의 경로(routes)를 answer 배열에 담는다.for …in 반복문을 이용하여 tickets의 인덱스를 도는데, 아직 방문하지 않은(사용하지 않은 티켓) 경우에, 만약 routes의 마지막 원소(routes.at(-1))가 tickets배열에서의 출발지라면 현재 노드를 방문 처리(visited[index] = true)하고, 다음 dfs를 진행(현재 까지의 경로들과 함께 이제 도착지를 기준으로 진행)하고 현재 노드는 방문 처리 취소(visited[idx] = false)한다.✅ 답안
function solution(tickets) {
const answer = [];
const len = tickets.length;
const visited = Array(len).fill(false);
const dfs = (routes) => {
if (routes.length === len + 1) answer.push(routes);
for (const idx in tickets) {
const [start, end] = tickets[idx];
if (!visited[idx]) {
if (routes.at(-1) === start) {
visited[idx] = true;
dfs([...route, end]);
visited[idx] = false;
}
}
}
};
dfs(["ICN"]);
return answer.sort()[0];
}