본문 바로가기
JAVA/Coding Test Study

[Lv.3] 여행경로 : Java

by ♡˖GYURI˖♡ 2024. 3. 27.
728x90
 

프로그래머스

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

programmers.co.kr

 

 

 

 

이해하기

 

[DFS] 프로그래머스 여행경로 "JAVA"

https://programmers.co.kr/learn/courses/30/lessons/43164?language=java주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "ICN" 공항에서 출발합니다.항공권 정보가 담긴 2차원 배열 ticke

velog.io

참고한 블로그 링크...

dfs를 사용하되 파라미터로 start(출발지), route(지금까지의 경로), tickets, count(사용한 티켓 수)를 넘겨준다.

 

 

 

문제풀이

import java.util.*;

class Solution {
    ArrayList<String> list;
    boolean[] visited;

    public String[] solution(String[][] tickets) {
        String[] answer = {};
        int count = 0;
        visited = new boolean[tickets.length];
        list = new ArrayList<>();

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

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

        return answer;
    }

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

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

 

    ArrayList<String> list;
    boolean[] visited;

 

경로를 저장할 list와 방문처리를 위한 visited

 

        String[] answer = {};
        int count = 0;
        visited = new boolean[tickets.length];
        list = new ArrayList<>();

 

사용한 티켓 수를 셀 count 변수를 만들어준다.

 

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

 

출발지는 ICN이고, 이미 ICN을 방문하였으므로 route에 ICN을 미리 담아준다.

 

        if (count == tickets.length) {
            list.add(route);
            return;
        }

 

dfs 함수를 돌다가 만약 티켓을 전부 사용했다면 list에 route를 저장해주고 return해준다.

 

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

 

티켓을 전부 돌면서, 출발지로부터 출발하고, 아직 사용하지 않은 티켓이라면 if문 내부를 실행한다.

방문 처리해주고, dfs에 사용한 티켓의 도착지를 넣어주고, route에 다음 경로를 더해준다.

예를 들어 "ICN", "JFK"라는 티켓을 사용한다면 route = "ICN JFK"가 된다.

 

이 부분이 신기한 풀이방법이라고 생각했다.

 

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

 

다시 solution 함수로 돌아와서 list를 정렬해준다. (알파벳 순서가 빠른 경로를 반환할 것이기 때문)

list의 0번째 값을 가져오되, String 배열을 return해야하므로 split(" ")을 사용하여 배열화해준다.

 

 

'JAVA > Coding Test Study' 카테고리의 다른 글

[Lv.1] 소수 찾기 : Java  (0) 2024.04.01
[Lv.2] 카펫 : Java  (0) 2024.04.01
[Lv.2] 수식 최대화 : Java  (2) 2024.03.27
[Lv.3] 단어 변환 : Java  (0) 2024.03.27
[Lv.3] 네트워크 : Java  (0) 2024.03.26