const bfs = (tickets, start) => {
const queue = [];
const visited = []; // (1)
const travelRoute = [];
queue.push(start);
while(queue.length !== 0) {
const airport = queue.shift();
for(const ticket of tickets) {
if (!visited.includes(ticket) && airport === ticket[0]) {
visited.push(ticket);
queue.push(ticket[1]);
break; // (2)
}
}
travelRoute.push(airport);
}
return travelRoute;
}
function solution(tickets) {
// 항상 "ICN" 공항에서 출발
const start = "ICN"
// 만약 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return
tickets.sort();
return bfs(tickets, start);
}
⇒ 테스트 케이스 1, 2번 실패함
function solution(tickets) {
const start = "ICN"
const travelRoute = [];
const visited = Array.from({length: tickets.length}, _ => false);
// 알파벳 순서로 티켓 정렬
tickets.sort();
const dfs = (path, index) => {
const airport = path[path.length - 1];
// 모든 도시를 방문했을 경우 여행경로 생성
if(index === tickets.length) travelRoute.push(...path);
// 이미 여행 경로가 생성되었을 경우 이후 다른 여행경로를 생성하지 않기 위해 종료
// 정렬한 상태이므로 다른 여행경로를 고려할 필요가 없다.
if (travelRoute.length) return; // (4)
// 항공권 순회
tickets.forEach((ticket, idx) => {
const [departure, arrive] = ticket;
// 방문 여부, 다음 항공권 출발지 확인
if (!visited[idx] && departure === airport) {
visited[idx] = true;
dfs([...path, arrive], index + 1);
// 모든 도시를 방문할 수 없는 경우, 방문처리 하지 않고 다음 항공권을 확인
visited[idx] = false; // (3)
}
})
}
dfs([start], 0);
return travelRoute;
}
const dfs = (graph, v, visited) => {
//1. 탐색 시작 노드 방문 처리
visited[v] = true;
console.log(v);
//2. 탐색 노드의 인접 노드 확인
for(const cur of graph[v]){
if(!visited[cur]){
dfs(graph, cur, visited);
}
}
}
let graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7],
]
let visited = [...Array(9).fill(false)];
dfs(graph, 1, visited);
참고