DFS + 백트래킹 으로 모든 티켓을 사용하는 경로를 탐색했다.
cnt == n)시 성공ICN → BBB
ICN → AAA
BBB → ICN
알파벳순으로 ICN → AAA 선택시 막힘!
→ 백트래킹으로 되돌아가 ICN → BBB → ICN → AAA 선택
알파벳순 정렬만으로는 항상 모든 티켓 사용이 보장되지 않는다.
막다른 길이 생길 수 있으므로 반드시 백트래킹이 필요하다.
import java.util.*;
class Solution {
public String[] solution(String[][] tickets) {
Arrays.sort(tickets, (a, b) -> a[1].compareTo(b[1]));
int n = tickets.length;
boolean[] visit = new boolean[n];
ArrayList<String> al = new ArrayList<>();
al.add("ICN");
dfs(0, n, "ICN", tickets, visit, al);
return al.stream().toArray(String[]::new);
}
public boolean dfs(int cnt, int n, String now, String[][] tickets,
boolean[] visit, ArrayList<String> al) {
if (cnt == n) return true;
for (int i = 0; i < n; i++) {
if (visit[i]) continue;
if (tickets[i][0].equals(now)) {
visit[i] = true;
al.add(tickets[i][1]);
if (dfs(cnt+1, n, tickets[i][1], tickets, visit, al)) return true;
// 백트래킹
visit[i] = false;
al.remove(al.size()-1);
}
}
return false;
}
}