주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "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"] 가 알파벳 순으로 앞섭니다.
이 문제의 핵심은 티켓을 모두 탐색했을 때의 경로를 구하는 것이다.
이때 경로가 여러가지면 사전 순으로 빠른 경로를 출력하는 해야한다.
public static class tripTicket implements Comparable<tripTicket>{
int no;
String from;
String to;
public tripTicket(int no, String from, String to) {
this.no = no;
this.from = from;
this.to = to;
}
@Override
public int compareTo(tripTicket o) {
if(this.from.equals(o.from)){
return this.to.compareTo(o.to);
}
return this.from.compareTo(o.from);
}
}
티켓의 출발지가 같으면 도착지 기준으로 정렬을 하기 위해서 별도의 클래스를 만들었다.
public static void BFS(String start, String[][] tickets, int cnt, String road){
if(cnt == tickets.length){
pq.add(road);
return;
}
for(tripTicket item : list){
if(!visited[item.no] && item.from.equals(start)){
visited[item.no] = true;
BFS(item.to, tickets, cnt + 1, road + " " + item.to);
visited[item.no] = false;
}
}
}
티켓들을 탐색하면서 탐색한 순서를 계속 누적하면서 재귀호출 하였다.
탐색 횟수와 티켓 수와 같으면 모든 티켓 탐색을 끝냈으므로 우선순위큐에 탐색 순서를 기록한 road 를 넣어 준다.
모든 재귀호출을 탈출 하였을 때 pq 에서 제일 처음에 있는 것을 꺼내 answer 배열에 넣어 준다.
이때 우선순위 큐 맨 앞에 있는 것이 사전순으로 첫번재로 오는 경로가 된다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.PriorityQueue;
public class Solution {
public static ArrayList <tripTicket> list;
public static boolean[] visited;
public static PriorityQueue<String> pq = new PriorityQueue<>();
public static class tripTicket implements Comparable<tripTicket>{
int no;
String from;
String to;
public tripTicket(int no, String from, String to) {
this.no = no;
this.from = from;
this.to = to;
}
@Override
public int compareTo(tripTicket o) {
if(this.from.equals(o.from)){
return this.to.compareTo(o.to);
}
return this.from.compareTo(o.from);
}
}
public static String[] solution(String[][] tickets) {
list = new ArrayList<>();
for (int i = 0; i < tickets.length; i++) {
list.add(new tripTicket(i, tickets[i][0], tickets[i][1]));
}
Collections.sort(list);
visited = new boolean[tickets.length];
BFS("ICN", tickets, 0, "ICN");
String[] answer = pq.poll().split(" ");
return answer;
}
public static void BFS(String start, String[][] tickets, int cnt, String road){
if(cnt == tickets.length){
pq.add(road);
return;
}
for(tripTicket item : list){
if(!visited[item.no] && item.from.equals(start)){
visited[item.no] = true;
BFS(item.to, tickets, cnt + 1, road + " " + item.to);
visited[item.no] = false;
}
}
}
}
