[프로그래머스/Lv. 3] 여행경로 (JAVA)
🔺 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🧩 해결 아이디어
• DFS
1. DFS를 활용해 모든 경우의 수를 구한다.
- DFS 종료 조건 ) 모든 티켓을 다 썼을 때, 도착지 값을 이동 경로 리스트에 저장한다.
- 반복문 ) 방문한 적 없고, 현재 도시가 다음 여행 경로의 도착지라면 탐색
2. 이동 경로 리스트를 오름차순으로 정렬하고, 리스트에서 맨 앞 값 (routeList.get(0))을 가져오면 알파벳 순으로 가장 빠른 경로다.
3. 첫 번째 문자열을 공백을 기준으로 분리하여 배열에 저장하고 출력한다.
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
import java.util.*;
class Solution {
static String[][] tickets;
static boolean[] visited;
static List<String> routeList = new ArrayList<>(); // 이동 경로 리스트
static int cnt = 0;
public String[] solution(String[][] tickets) {
this.tickets = tickets;
visited = new boolean[tickets.length];
dfs("ICN", "ICN", 0); // 현재 도시, 여행 경로, 사용한 티켓 수
Collections.sort(routeList); // 알파벳 순 경로 가져오기 위한 오름차순 정렬
String[] answer = routeList.get(0).split(" ");
return answer;
}
private static void dfs(String now, String route, int depth) {
if(depth == tickets.length) { // 모든 티켓 다 썼을 때, 리스트에 이동 경로 추가하기
routeList.add(route);
return;
}
for(int i = 0 ; i < tickets.length ; i++) {
if(!visited[i] && now.equals(tickets[i][0])) { // 방문한 적 없고, 현재 도시가 다음 여행 경로의 도착지라면 탐색
visited[i] = true;
dfs(tickets[i][1], route + " " + tickets[i][1], depth + 1);
visited[i] = false;
}
}
}
}
|
cs |
🔺 다른 풀이들
- Node 클래스를 생성하신 풀이
프로그래머스 - 여행경로(Java)
dfs 문제입니다. 주어지는 항공권을 모두 사용해서 여행 경로를 만들어야 합니다. 저의 경우 항공권이 주어지면 해당 정보를 Map에 저장했습니다. Map에 저장하면 O(1)로 value를 가져올 수 있기 때문
ksb-dev.tistory.com
💬 느낀 점
플그머스로 dfs bfs 푸는 게 헷갈린당.....ㅠ
담엔 꼭 더 잘 풀어보겠다.
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
✔ DFS 풀이 참고
[DFS] 프로그래머스 여행경로 "JAVA"
https://programmers.co.kr/learn/courses/30/lessons/43164?language=java주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "ICN" 공항에서 출발합니다.항공권 정보가 담긴 2차원 배열 ticke
velog.io
[프로그래머스] 여행경로 - JAVA
DFS/BFS 공부 중 풀어본 문제다. 이론은 대충 알겠는데 막상 구현하려니 머리가 터질 것 같았다. ㅋㅋㅋDFS는 깊이 우선 탐색으로 함수 속에 함수... 그 속에 함수... 또 그 속에 함수... 이런 식으로
velog.io