📂문제 설명
주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 ICN 공항에서 출발합니다.
항공권 정보가 담긴 2차원 배열 tickets가 매개변수로 주어질 때, 방문하는 공항 경로를 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항
- 모든 공항은 알파벳 대문자 3글자로 이루어집니다.
- 주어진 공항 수는 3개 이상 10,000개 이하입니다.
- tickets의 각 행 [a, b]는 a 공항에서 b 공항으로 가는 항공권이 있다는 의미입니다.
- 주어진 항공권은 모두 사용해야 합니다.
- 만일 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return 합니다.
- 모든 도시를 방문할 수 없는 경우는 주어지지 않습니다.
입출력 예
tickets return
[[ICN, JFK], [HND, IAD], [JFK, HND]] | [ICN, JFK, HND, IAD] |
[[ICN, SFO], [ICN, ATL], [SFO, ATL], [ATL, ICN], [ATL,SFO]] | [ICN, ATL, ICN, SFO, ATL, SFO] |
입출력 예 설명
예제 #1
[ICN, JFK, HND, IAD] 순으로 방문할 수 있습니다.
예제 #2
[ICN, SFO, ATL, ICN, ATL, SFO] 순으로 방문할 수도 있지만 [ICN, ATL, ICN, SFO, ATL, SFO] 가 알파벳 순으로 앞섭니다.
📂아이디어 및 알고리즘(문제 풀이)
- 먼저 모든 공항은 한번씩만 방문해야하기 때문에 이에 대한 Check가 필요하다. 그리고 같은 갈 수 있는 경로가 2개 일때는 알파벳 순서가 빠른 곳부터 가야한다. 출발점과 도착점에 대해 DFS로 연결해주면 쉽게 해결할 수 있다.
- DFS에서는 방문하는 곳마다 String record값에 저장하여 어디에서 어디로 이동했는지를 기록한다.
- for문 안에서는 해당 항공편이 현재 사용 되었는지 + 출발하는곳이 now와 같은지를 비교하여
- 방문하지 않은 곳이면 티켓(visited[index])을 true로 하여 사용한걸 나타내주고
- DFS에 도착지점을 출발점(now=tickets[index][1])을 바꿔주고 record값에 도착지점을 넣어준다.
- 티켓을 모두 사용했을때는 record값을 ArrayList에 추가해준다.
- 이렇게 DFS 순회를 끝내고 나서 ArrayList값들을 오름차순으로 해주어 조건에 맞는 여행경로인 첫번째 index값을 출력해준다.
📂소스 코드
import java.util.ArrayList;
import java.util.Collections;
class Solution {
static boolean[] visited;
static ArrayList<String> airplanes;
public String[] solution(String[][] tickets) {
visited = new boolean[tickets.length];
airplanes = new ArrayList<String>();
DFS(0, "ICN", "ICN",tickets);
Collections.sort(airplanes);
String[] answer = airplanes.get(0).split(" ");
return answer;
}
public static void DFS(int count, String now, String record, String[][]ticktes) {
if(count == ticktes.length) {
airplanes.add(record);
return;
}
for(int i = 0; i < ticktes.length; i++) {
if(!visited[i] && ticktes[i][0].equals(now)) {
visited[i] = true;
DFS(count+1, ticktes[i][1],record+" "+ticktes[i][1] , ticktes);
visited[i] = false;
}
}
return;
}
}
'알고리즘(Java) > programmers' 카테고리의 다른 글
[JAVA] 징검 다리(코딩테스트 고득점 Kit [이분 탐색]) - LEVEL4 (0) | 2020.11.11 |
---|---|
[JAVA] 입국심사(코딩테스트 고득점 Kit [이분 탐색]) - LEVEL3 (0) | 2020.11.11 |
[JAVA] 단어 변환(코딩테스트 고득점 Kit [깊이/너비 우선탐색(DFS/BFS)]) - LEVEL3 (0) | 2020.11.11 |
[JAVA] 네트워크(코딩테스트 고득점 Kit [깊이/너비 우선탐색(DFS/BFS)]) - LEVEL3 (0) | 2020.10.23 |
[JAVA] 타겟 넘버(코딩테스트 고득점 Kit [깊이/너비 우선탐색(DFS/BFS)]) - LEVEL2 (0) | 2020.10.23 |