문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/43164
[프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr](https://school.programmers.co.kr/learn/courses/30/lessons/43164%5D)
풀이방법
"만일 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return 합니다" 라는 조건이 존재하기 때문에
입력받은 tickets를 정렬해주었다.
JS에서 sort 함수를 사용하면 알아서 사전 순 정렬을 해준다. 신기하게 2차원 배열도 우리가 원하는 결과대로 정렬해준다.
항상 "ICN"에서 출발하기 때문에 answer 배열에 "ICN"을 넣어준다.
이후는 주석에 적어둔 로직대로 작동한다.
정답코드
function solution(tickets) {
var answer = [];
let visit = new Array(tickets.length).fill(false); // 방문 여부 저장
let sortedTickets = tickets.sort(); // 티켓 사전순으로 정렬
let len = sortedTickets.length;
answer.push("ICN"); // 항상 "ICN"에서 출발
const DFS = (str) => {
for(let i=0;i<len;i++){
if(!visit[i] && str == sortedTickets[i][0]){ // 방문하지 않았고 가능한 경로일 때
answer.push(sortedTickets[i][1]); // answer 배열에 넣어주고
visit[i]=true; // 방문 처리 해줌
DFS(sortedTickets[i][1]); // DFS 재귀호출
if(answer.length == len+1) return; // 모두 방문한 경우 종료시킬 조건
visit[i]=false; // 탐색에 실패한 경우 방문하지 않음으로 처리
answer.pop(); // answer 배열에서 삭제
}
}
}
DFS("ICN");
return answer;
}
시행착오
먼저 실패했던 코드부터 보자.
function solution(tickets) {
var answer = [];
let visit = new Array(tickets.length).fill(false);
let sortedTickets = tickets.sort();
let len = sortedTickets.length;
answer.push("ICN");
const DFS = (str) => {
if(answer.length === len+1) return;
for(let i=0;i<len;i++){
if(!visit[i] && str == sortedTickets[i][0]){
answer.push(sortedTickets[i][1]);
visit[i]=true;
DFS(sortedTickets[i][1]);
}
}
}
DFS("ICN");
return answer;
}
위의 성공했던 코드와 비교해서 보자면
- 탐색에 실패했을 때를 생각하지 않았다.
- 탈출 구문( if(answer.length == len+1) return; )의 위치가 바뀌었다.
탐색에 실패했을 때를 생각해서 방문하지 않음으로 처리해주고, answer 배열에서 삭제해줬다.
그리고 탈출 구문을 옮김으로써 문제를 해결했다.
'Programmers' 카테고리의 다른 글
[Programmers]우박수열 정적분/JS (0) | 2024.06.02 |
---|---|
[Programmers]산 모양 타일링[JS] (0) | 2024.04.13 |
[Programmers]야근 지수/JS (5) | 2024.04.07 |
[Programmers]캐시/JS (1) | 2024.04.05 |
[Programmers]등굣길/JS (2) | 2024.04.04 |