728x90
반응형
✈️ 프로그래머스 Level 3 – 여행경로(Java, DFS 백트래킹) 풀이
오늘은 프로그래머스에서 정말 자주 등장하는 그래프/백트래킹 문제,
바로 “여행경로” 문제를 정리해봤다.
이 문제의 핵심은 아주 단순하다.
주어진 항공권들을 모두 사용해서 만들 수 있는 경로 중
사전순으로 가장 앞서는 경로를 찾는 것.
그래서 DFS + 백트래킹을 이용해
"항공권을 사용했다가 다시 되돌리기" 작업을 하면서
모든 경우의 수를 탐색한다.
📌 문제 핵심 포인트
✔️ 1. 항상 "ICN"에서 출발
문제에서 출발점이 고정되어 있다.
✔️ 2. 티켓을 사전순으로 정렬해야 함
왜?
→ DFS 진행 중 여러 경로가 생기는데,
사전순으로 정렬해두면 가장 먼저 완성되는 경로가 곧 정답이기 때문이다.
✔️ 3. 모든 티켓을 사용했을 때가 종료 조건
티켓 개수가 N일 때
도착 경로의 길이는 N+1이 되어야 한다.
✔️ 4. DFS + 백트래킹
- 티켓을 사용하면 vist[i] = true
- 탐색이 끝났는데 답이 안 되면 다시 vist[i] = false 로 되돌림
- 전체 경로가 완성되는 순간 더 이상 탐색할 필요 없이 바로 종료
🧠 풀이 흐름
- 티켓 배열을 출발지 → 도착지 기준으로 사전순 정렬
- DFS 시작
- 방문하지 않은 티켓 중
출발지가 현재 위치와 같은 티켓만 탐색 - 해당 티켓을 선택 → 다음 도시로 이동
- 모든 티켓을 사용했다면 정답 확정
- 정답이 나오면 더 이상 다른 경로 탐색하지 않도록 chk 플래그로 가지치기
🧩 자바 코드 (DFS 백트래킹)
import java.util.*;
class Solution {
boolean chk = false;
public String[] solution(String[][] tickets) {
String[] answer = new String[tickets.length + 1];
Arrays.sort(tickets, (a, b) -> {
int s = a[0].compareTo(b[0]);
if (s == 0) return a[1].compareTo(b[1]);
return s;
});
boolean[] vist = new boolean[tickets.length];
answer[0] = "ICN";
dfs(tickets, answer, vist, 0, "ICN");
return answer;
}
private void dfs(String[][] tickets, String[] answer, boolean[] vist, int dist, String con) {
if (chk) return;
if (dist == tickets.length) {
chk = true;
return;
}
for (int i = 0; i < tickets.length; i++) {
if (!vist[i] && tickets[i][0].equals(con)) {
answer[dist + 1] = tickets[i][1];
vist[i] = true;
dfs(tickets, answer, vist, dist + 1, tickets[i][1]);
if (chk) return;
vist[i] = false;
}
}
}
}
🎯 정리
이 문제는 그래프 탐색 + 백트래킹 + 사전순 정렬
이 세 가지를 모두 요구하는 좋은 문제다.
특히,
정답을 찾은 순간 탐색을 끊는 가지치기(chk) 처리가
시간 초과를 막는 핵심 포인트다.
코테에서 DFS/백트래킹 문제를 연습하고 싶다면
반드시 한 번은 풀어봐야 할 문제라고 생각한다.
728x90
반응형
'JAVA > 프로그래머스' 카테고리의 다른 글
| 프로그래머스 Level 1 – 모의고사(Java) 풀이 (0) | 2025.11.18 |
|---|---|
| 프로그래머스 Level 1 – 최소직사각형(Java) (0) | 2025.11.18 |
| 프로그래머스 Level 3 – 아이템 줍기(Java, BFS + 테두리 따라가기) (0) | 2025.11.18 |
| 프로그래머스 Level 3 – 단어 변환(Java, BFS) (0) | 2025.11.18 |
| 프로그래머스 Level 2 – 게임 맵 최단거리(Java, BFS) (0) | 2025.11.18 |
댓글