본문 바로가기
알고리즘/문제 풀이

프로그래머스: 여행경로

by 위대한초밥V 2023. 10. 18.

https://school.programmers.co.kr/learn/courses/30/lessons/43164

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

설명

나의 처음 아이디어는 map을 이용해서 푸는 것이었다.

key가 출발지가 되고, value는 도착지를 정렬해서 담고 있는 PriorityQueue이다.

그리고 매번 이동할 때마다, map에서 출발지를 찾고 도착지의 첫번째 원소가 이 다음 출발지가 되는 방식이다.

이런식으로 했을 때, 주어진 테스트 케이스는 통과되지만 다음 케이스같은 경우는 런타임에러가 발생한다.

  • Parameters: [["ICN", "JFK"], ["ICN", "AAD"], ["JFK", "ICN"]]
  • Return: ["ICN", "JFK", "ICN", "AAD"]

=> 출발지가 ICN일 때, PriorityQueue에 의해 정렬되어 AAD로 바로 방문할 수 있지만, AAD 이후에는 갈 곳이 없다...

=> 따라서 RuntimeError가 발생한다!

 

그럼 무슨 방법이 있을까? 

그렇다 탐색이다...

dfs로 갈 수 있는 경로를 구하고, 구한 경로들을 PriorityQueue에 넣는다.

경로들은 사전순으로 정렬되기 때문에 문제에서 요구하는 만일 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return 합니다. 조건도 만족하게 된다.

 

코드

import java.util.*;

class Solution {
    static boolean[] visited;
    static PriorityQueue<String> queue;
    public String[] solution(String[][] tickets) {
        String[] answer = {};
        queue = new PriorityQueue<String>();

        visited = new boolean[tickets.length];

        dfs("ICN", 0, "ICN", tickets);

        String stringAnswer = queue.poll();
        answer = stringAnswer.split(",");

        return answer;
    }

    static void dfs(String now, int count, String trip, String[][] tickets) {
        if(count == tickets.length) {
            queue.add(trip);
            return;
        }

        for(int i = 0; i < tickets.length; i++) {
            if(!visited[i] && now.equals(tickets[i][0])) {
                visited[i] = true;
                dfs(tickets[i][1], count+1, trip + "," + tickets[i][1], tickets);
                visited[i] = false;
            }
        }
    }
}
반응형