/**
     * - 문제
     * 방문하는 공항 경로를 배열에 담아 출력

     * - 조건
     * 1) 주어진 항공권을 모두 이용해 여행경로를 구성
     * 2) 항상 ICN 공항에서 출발
     * 3) 만약 출발 경로가 같을 경우 정렬 필요
**/

 

[ 제가 작성한 코드 ]

import java.util.Arrays;
import java.util.Comparator;
import java.util.Stack;

public class TripCourse {
    /**
     * - 문제
     * 방문하는 공항 경로를 배열에 담아 출력

     * - 조건
     * 1) 주어진 항공권을 모두 이용해 여행경로를 구성
     * 2) 항상 ICN 공항에서 출발
     **/

    private static boolean[] visit;
    private static Stack<String> stack = new Stack<>();
    private static String[] answer;
    private static int cnt = 0;

    public static void main(String[] args) {
        String[][] tickets = {
                {"ICN", "SFO"}, {"ICN", "ATL"}, {"SFO", "ATL"}
                ,{"ATL","ICN"},{"ATL","SFO"}};

        String[][] tickets2 = {
                {"ICN", "JFK"}, {"HND", "IAD"}, {"JFK", "HND"}
                };

        String res = Arrays.toString(solution(tickets));
        System.out.println(res);
    }

    public static String[] solution(String[][] tickets) {
        answer = new String[tickets.length + 1];
        visit = new boolean[tickets.length];
        answer[cnt++] = tickets[0][0];

        for (int i = 1; i < tickets.length; i++) {
            String prev = tickets[i-1][0];

            if (tickets[i][0].equals(prev)) {
                Arrays.sort(tickets, new Comparator<String[]>() {
                    @Override
                    public int compare(String[] o1, String[] o2) {
                        return o1[1].compareTo(o2[1]);
                    }
                });
                break;
            }
        }

        dfs(tickets,tickets[0][1],0);
        return answer;
    }

    public static void dfs(String[][] tickets, String start, int check) {
        stack.push(start);
        visit[check] = true;

        while (!stack.isEmpty()) {
            String nodeString = stack.pop(); // 방문 노드
            answer[cnt++] = start;
            for (int i = 0; i < tickets.length; i++) {
                if (tickets[i][0].equals(nodeString)) {
                    if(!visit[i]){
                        dfs(tickets, tickets[i][1], i);
                    }
                }
            }
        }
    }
}

 

 

[ 코드 채점 결과 ]

 

 

[ 다른 사람 코드 리뷰 ]

1) 모든 경우의 수를 구한 다음  Collections.sort() 를 통해 정렬하기 위해 리스트 선언

2) 첫 출발은 항상 "ICN" 이기 때문에 DFS 시작을 "ICN"으로 해주고, route 시작도 "ICN" 으로 시작해준다.

3) DFS 함수에서 모든 티켓을 다 썼을 때, allRoute에 구한 경로를 add() 해준다.

4) 연결되어 있는 공항으로 꼬리물기를 하며 티켓의 시작 공항이 start 와 같고 방문하지 않은경우

    dfs() 의 start 자리에 ticket[i][1] 을 넣고 재탐색해준다.

5) 이때 visited[i] = false 로 바꿔 주는 이유는 모든 경로를 탐색하기 위함이다.

6) 모든 경우의 수를 allRoute에 넣은 후 Collections.sort() 로 정렬하고

     첫번째 문자를 가져오게 되면 알파벳 순으로 가장 빠른 경로를 구할 수 있다.

     이때, split() 을 통해 문제에서 원하는 출력으로 바꿔준다.

 

import java.util.*;

public class TripCourse {
    /**
     * - 문제
     * 방문하는 공항 경로를 배열에 담아 출력

     * - 조건
     * 1) 주어진 항공권을 모두 이용해 여행경로를 구성
     * 2) 항상 ICN 공항에서 출발
     **/

    private static boolean[] visit;
    private static ArrayList<String> allRoute;

    public static void main(String[] args) {
        String[][] tickets = {
                {"ICN", "SFO"}, {"ICN", "ATL"}, {"SFO", "ATL"}
                ,{"ATL","ICN"},{"ATL","SFO"}};

        String[][] tickets2 = {
                {"ICN", "JFK"}, {"HND", "IAD"}, {"JFK", "HND"}
                };

        String res = Arrays.toString(solution(tickets));
        System.out.println(res);
    }

    public static String[] solution(String[][] tickets) {
        String[] answer = {};
        int cnt = 0;
        visit = new boolean[tickets.length];
        allRoute = new ArrayList<>();

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

        Collections.sort(allRoute);
        answer = allRoute.get(0).split(" ");

        return answer;

    }

    public static void dfs(String start, String route, String[][] tickets, int cnt) {
        if (cnt == tickets.length) {
            allRoute.add(route);
            return;
        }

        for (int i = 0; i < tickets.length; i++) {
            if (start.equals(tickets[i][0]) && !visit[i]) {
                visit[i] = true;
                dfs(tickets[i][1], route + " " + tickets[i][1], tickets, cnt+1);
                visit[i] = false;
            }
        }

    }
}

'프로그래머스' 카테고리의 다른 글

타겟넘버  (0) 2022.10.06
줄 서는 방법  (0) 2022.10.04
가장 먼 노드  (0) 2022.09.30
베스트 앨범  (0) 2022.09.29
단어 변환  (0) 2022.09.28

+ Recent posts