
주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 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] |
원래 작성한 코드가 있었는데, 테스트 케이스는 통과했지만 채점은 50%밖에 통과하지 못했다. [[1,2], [1,3], [3,1]] 같은 경우가 반례였는데, 티켓 [1,2]만 사용하고 dfs가 종료되어 모든 카드를 사용하지 않는다는 문제가 있었다. 이거 가지고 계속 삽질하다가 도저히 풀리지가 않아서 구글링해서 코드를 보고 이해했다..=
내가 직접 썼던 코드랑 구글링한 코드랑 차이점을 보자면..
ICN부터 출발하는 모든 티켓에 대해 dfs를 실행한다.import java.util.*;
class Solution {
private static final int SRC = 0;
private static final int DST = 1;
private static ArrayList<String> answer = new ArrayList<>();
private static String route = "";
private static boolean[] visited;
public static String[] solution(String[][] tickets) {
for (int i = 0; i < tickets.length; i++) {
visited = new boolean[tickets.length];
String src = tickets[i][SRC];
String dst = tickets[i][DST];
if (src.equals("ICN")) {
route = src + ",";
visited[i] = true;
dfs(tickets, dst, 1);
}
}
Collections.sort(answer);
return answer.get(0).split(",");
}
private static void dfs(String[][] tickets, String dst, int visitCount) {
route += dst + ",";
if (visitCount == tickets.length) {
answer.add(route);
return;
}
for (int i = 0; i < tickets.length; i++) {
String nextSrc = tickets[i][SRC];
String nextDst = tickets[i][DST];
if (nextSrc.equals(dst) && !visited[i]) {
visited[i] = true;
dfs(tickets, nextDst, visitCount + 1);
visited[i] = false;
route = route.substring(0, route.length() - 4);
}
}
}
}