코딩테스트
[릿코드 / js] 332. Reconstruct Itinerary
_서리__
2023. 9. 14. 16:49
var findItinerary = function(tickets) {
//1.출발점이 JFK인 친구 뽑아냄.
//2.도착점 알파벳순으로 정렬하여 제일 처음인 친구로 감.
//3. 재귀와 while을 섞어야할듯...?
let output = [];
tickets.sort();
return recurr(tickets, "JFK", output);
};
let check = function(tickets, departure)
{
if (tickets.length === 0) return true;
for (let i = 0; i < tickets.length; i++)
{
if (tickets[i][0] === departure)
{
return (check([...tickets.slice(0,i),...tickets.slice(i+1)], tickets[i][1]))
}
}
return false;
}
let recurr = function(tickets, departure, output)
{
output.push(departure)
if (tickets.length === 0) return output;
tickets.sort();
for (let i = 0; i < tickets.length; i++)
{
if (tickets[i][0] === departure )
{
if (check([...tickets.slice(0,i),...tickets.slice(i+1)], tickets[i][1]))
{
return recurr([...tickets.slice(0,i),...tickets.slice(i+1)], tickets[i][1], output)
}
}
}
return output
}
-> 백트래킹이 어려워서 백트래킹을 무려 두번하는... 대 참사가 발생함
var findItinerary = function(tickets) {
let output = [];
tickets.sort();
return recurr(tickets, "JFK", output, 0);
};
let recurr = function(tickets, departure, output)
{
output.push(departure);
if (tickets.length === 0) return output;
for (let i = 0; i < tickets.length; i++)
{
if (tickets[i][0] === departure )
{
if (recurr([...tickets.slice(0,i),...tickets.slice(i+1)], tickets[i][1], output))
{
return output;
}
}
}
output.pop();
return false
}
--> 수정버전
처음에 output을 push하되, recur조건에 충족하지 않으면 pop을해서 취소해줌.