주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "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"] 가 알파벳 순으로 앞섭니다.
- DFS로 풀기
- 오름차순 정렬은 어떻게?
- DFS로 풀고 모든 완성 경로를 ArrayList에 저장
- ArrayList 답을 오름차순하여 첫번째 경로 리턴
- 다른 사람의 글을 보니 처음 tickets 배열을 정렬한 후 푸는 것이 더 간단
import java.util.*;
class Solution {
String[] answer;
public String[] solution(String[][] tickets) {
//정렬
Arrays.sort(tickets, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
if(o1[0].equals(o2[0])) {
return o2[1].compareTo(o1[1]);
}else {
return o2[0].compareTo(o1[0]);
}
}
});
ArrayList route = new ArrayList();
route.add("ICN");
getAnswer(tickets, "ICN", route);
return answer;
}
public void getAnswer(String[][] tickets, String here, ArrayList route){
//여행 경로를 완성하면 return
if(route.size() == tickets.length+1) {
answer = new String[route.size()];
for(int i=0; i<route.size(); i++)
answer[i] = (String)route.get(i);
return ;
}
//순회하며 here에서 출발!
for(int i=0; i<tickets.length; i++){
//티켓 출발지가 here이라면 티켓 제거하고 다음으로 이동(재귀)
if(tickets[i][0].equals(here)){
//티켓 제거 전 백업
String[] ticket = new String[2];
ticket[0] = tickets[i][0];
ticket[1] = tickets[i][1];
tickets[i][0] = "";
tickets[i][1] = "";
route.add(ticket[1]);
//티켓 제거하고 다음 행선지 출발
getAnswer(tickets, ticket[1],route);
//돌아왔으면 티켓, 경로 원상복구
tickets[i][0] = ticket[0];
tickets[i][1] = ticket[1];
route.remove(route.size()-1);
}
}
}
}