항해99 코테 스터디 12일차 문제인 프로그래머스의 '여행경로'는 주어진 티켓을 가지고 모든 도시를 순회하는 경로를 구하는 문제다. 난이도는 레벨3이며 DFS나 BFS를 통해 해결할 수 있다.
오늘의 문제 - 여행경로 문제 정보
문제 키워드
- DFS/BFS
난이도
- Level 3
문제 요약
- 티켓 정보(출발지-도착지)를 담은 배열이 주어진다.
- ICN(인천공항)에서 출발하여 모든 티켓을 사용해 모든 도시를 순회하는 경로를 구하여라.
- 단, 정답이 여러개일 경우 사전순으로 더 빠른 경로를 선택해야 한다.
문제 풀이 과정
- 티켓 정보를 그래프라고 생각하고, ICN에서 출발하여 사전순으로 더 빠른 티켓부터 사용해가며 도시를 순회한다.
- 사전순으로 더 빠른 티켓부터 방문하기 위해, 각 출발지에 대한 도착지 리스트를 사전순으로 정렬하였다.
- 도시 순회는 DFS를 사용했다. 모든 도시를 방문하는 경우를 찾는 과정에는 BFS보다 DFS가 더 빠를 거라고 생각했기 때문이다.
- 모든 티켓을 사용한 경우에 정답을 저장한다.
코드
import java.util.*;
class Solution {
private Map<String, List<Ticket>> ticketMap = new HashMap<>();
private boolean[][] used;
private List<String> answer;
private boolean foundAnswer = false;
public List<String> solution(String[][] tickets) {
// 티켓 정보를 인접 리스트 맵으로 변경
for(String[] ticket: tickets) {
String s = ticket[0], d = ticket[1];
ticketMap.putIfAbsent(s, new ArrayList<>());
ticketMap.get(s).add(new Ticket(s, d));
}
// 각 인접 리스트를 알파벳순으로 정렬
for(String key: ticketMap.keySet()) {
Collections.sort(ticketMap.get(key));
}
// DFS를 이용해 경로 찾기
List<String> route = new ArrayList<>();
route.add("ICN");
dfs(tickets.length, "ICN", route);
return answer;
}
private void dfs(int N, String here, List<String> route) {
// 가장 사전순으로 빠른 정답만 찾으면 되므로
// 정답을 이미 찾은 경우에는 건너뜀
if (foundAnswer) {
return;
}
// N개의 티켓을 모두 사용한 경우 정답 저장
if (route.size() == N+1) {
answer = new ArrayList<>(route);
foundAnswer = true;
return;
}
// 현재 위치에서 사용 가능한 티켓을 사용하고 루트에 추가하여 다음 재귀에 들어감
if (ticketMap.containsKey(here)) {
for(Ticket ticket: ticketMap.get(here)) {
if(!ticket.used) {
ticket.used = true;
route.add(ticket.dest);
dfs(N, ticket.dest, route);
ticket.used = false;
route.remove(route.size()-1);
}
}
}
}
class Ticket implements Comparable<Ticket> {
String source;
String dest;
boolean used = false;
public Ticket(String source, String dest) {
this.source = source;
this.dest = dest;
}
@Override
public int compareTo(Ticket other) {
return this.dest.compareTo(other.dest);
}
}
}
- 시간복잡도: O(NlogN)
- 공간복잡도: O(N)
728x90
'알고리즘 > 항해99 스터디' 카테고리의 다른 글
99클럽 코테 스터디 15일차 TIL - 프로그래머스 '네트워크' (0) | 2024.06.03 |
---|---|
99클럽 코테 스터디 14일차 TIL - DFS/BFS (0) | 2024.06.02 |
99클럽 코테 스터디 11일차 TIL - 그래프 탐색(DFS/BFS) (0) | 2024.05.30 |
99클럽 코테 스터디 10일차 TIL - 완전탐색 (0) | 2024.05.29 |
99클럽 코테 스터디 9일차 TIL - 완전탐색 (0) | 2024.05.28 |
댓글