*모든 코드는 Javascript로 작성합니다.
*코드는 참고용으로만 봐주세요!
문제
https://programmers.co.kr/learn/courses/30/lessons/43164
코딩테스트 연습 - 여행경로
[["ICN", "SFO"], ["ICN", "ATL"], ["SFO", "ATL"], ["ATL", "ICN"], ["ATL","SFO"]] ["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"]
programmers.co.kr
해결방법
< ICN에서 출발하여 dfs로 공항을 탐색한다. tickets 개수만큼 탐색을 진행했을 때 모든 edge가 탐색되었다면 빠짐없이 방문한 것이므로, 탐색 경로를 결과에 넣는다.>
- dfs 인수: vertex, cnt
vertex는 다음 탐색할 공항을 의미하고, cnt는 탐색을 진행한 횟수. 나중에 cnt == tickets.length일 때 dfs를 종료하고, 모든 edge가 탐색되었다면 그 경로를 저장해야 한다.
- dfs 바깥에는 각 ticket 사용 여부를 트래킹할 배열 check, 마지막에 조건에 부합할 경우 그 경로를 담을 배열 result가 필요하다.
- 탐색 종료 후 result에 담긴 모든 가능한 경로들을 알파벳 순서로 정렬하여, 첫 번째 요소를 반환한다.
코드
function solution(tickets) { var answer = getOrders("ICN"); if (answer.length == 1) return answer[0]; //가능한 경로 하나뿐이라면 그 경로 반환. else { answer.sort(sortFunction); //여러 개일 경우 sort return answer[0]; } function sortFunction(a, b){ //정렬용 함수 for (let i = 0 ; i < a.length; i++){ if (a[i]!=b[i]){ if (a[i] > b[i]) return 1; else if (a[i] < b[i]) return -1; } } } function getOrders(v){ var check = new Array(tickets.length); //ticket 사용 여부를 체크하기 위한 배열 check.fill(0); var result = []; //가능한 모든 경로들 담을 배열 var order = []; //방문힌 공항 순서(경로 하나) 담을 배열 function dfs(vertex, cnt){ if (cnt == tickets.length){ if (!check.every((el)=>el==1)) return 0; //모든 티켓이 사용되지 않았다면 실패. else { var arr = [...order]; arr.push(vertex); result.push(arr); //모든 티켓이 사용되었다면 result에 넣어줌. } } for (let i = 0; i < tickets.length; i++){ if (tickets[i][0] == vertex && check[i] == 0){ check[i] = 1; order.push(vertex); dfs(tickets[i][1], cnt+1); check[i] = 0; order.pop(vertex); } } } dfs(v, 0); if (result.length == 0) return 0; return result; } return answer; } |
'Coding test > programmers' 카테고리의 다른 글
[프로그래머스] Lv.3 네트워크 (자바스크립트) (0) | 2022.07.01 |
---|---|
[프로그래머스] Lv.3 입국심사 (자바스크립트) (0) | 2022.06.30 |
[프로그래머스] Lv.3 디스크 컨트롤러 (자바스크립트) (0) | 2022.06.30 |