프로그래머스 LEVEL 3(여행경로)

image

  • 사용 언어 : javascript

  • 해결 날짜 : 2022-10-24

  • 해결 방법 :
    • 출발지인 인천으로부터 도착지까지의 경로를 전부 경유해야 하기 때문에 dfs를 사용하는게 나을 것 같아서 dfs 사용
    • 출발지-도착지 쌍을 방문하지 않은 경우
      • 방문 처리
      • 도착지를 출발지로 선택, 현재까지의 경로, count + 1을 dfs를 사용해 재귀
      • 방문 처리 취소
    • 경로를 잘 선택하여 모든 경로를 경유한 경우, answer과 비교하여 작은 값 answer에 업데이트 후 dfs 종료
  • 회고 :
    • 처음에 방문 여부를 저장하기위해 ‘출발지, 도착지’를 key로 갖는 객체를 생성했는데 더 간단한 방법이 존재
    • 전체 경로를 비교할 때 join(‘’) 후 비교했는데 안돼서 헤맴
  • 코드

    function solution(tickets) {
        const visited = Array.from({length: tickets.length}, () => false);
        let answer = [];
            
        const dfs = (from, route, count) => {
            if (count === tickets.length) {
                if (!answer.length || answer.toString() > route.toString()) answer = route;
                return;
            }
                
            for (let i = 0; i < tickets.length; i++) {
                if (!visited[i] && from === tickets[i][0]) {
                    visited[i] = true;
                    dfs(tickets[i][1], [...route, tickets[i][1]], count + 1);
                    visited[i] = false;
                }
            }
        }
            
        dfs('ICN', ['ICN'], 0);
            
        return answer;
    }
    
  • 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges