728x90
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
오늘은 DFS 알고리즘 문제를 풀었다.
DFS
DFS는 깊이 우선 탐색(Depth-First Search)의 약어로,
그래프 및 트리의 한 정점에서 모든 정점을 방문하는 알고리즘 중 하나이다.
특징
1. 한 정점에서 시작하여 가장 깊은 곳 (최하위의 자식 노드) 까지 탐색하고, 되돌아와서 다음 가능한 경로를 탐색한다.
2. 스택(Stack) 자료구조를 사용한다.
3. 모든 정점을 방문하여야 할 때 사용된다.
4. 정점의 이웃 정점들을 재귀적으로 방문하여 구현한다.
5. 깊이를 가늠할 수 없을 경우, 스택오버플로우가 발생할 수 있다.
DFS(깊이우선탐색), BFS(너비우선탐색)
정점(node)과 그 정점을 연결하는 간선(edge)로 이루어진 자료구조의 일종그래프를 탐색한다는 것은 하나의 정점으로부터 시작하여 차례대로 모든 정점들을 한 번씩 방문하는 것아주 간단한게만
velog.io
아직 익숙치 않아서 코드를 작성하는데에 헷갈리는게 많아 어려웠다.
그래서 이번기회에 확실히 이해할 수 있도록 주석을 하나하나 달아가며 코드를 작성하였다.
import java.util.*;
class Solution {
static boolean[] visited; // 사용한 항공권을 표시하기 위한 배열
static ArrayList<String> allRoute; // 모든 가능한 경로를 저장하는 리스트
public String[] solution(String[][] tickets) {
String[] answer;
visited = new boolean[tickets.length];
allRoute = new ArrayList<>();
// DFS 시작
dfs("ICN", "ICN", tickets, 0);
// 탐색을 마친 후, 알파벳 순서로 정렬
Collections.sort(allRoute);
// 가장 먼저 나오는 경로를 반환
answer = allRoute.get(0).split(" ");
return answer;
}
public static void dfs(String start, String route, String[][] tickets, int cnt) {
// 모든 항공권을 사용하여 여행 경로를 구성했을 경우
if (cnt == tickets.length) {
// 해당 경로를 리스트에 추가
allRoute.add(route);
return;
}
// 현재 위치에서 출발하여 가능한 모든 항공권을 탐색
for (int i = 0; i < tickets.length; i++) {
// 아직 사용되지 않은 항공권 중 현재 위치에서 출발하는 항공권이 있을 경우
if (start.equals(tickets[i][0]) && !visited[i]) {
visited[i] = true; // 항공권을 사용했음을 표시
// 다음 출발지를 도착지로 설정하여 DFS 재귀 호출
dfs(tickets[i][1], route + " " + tickets[i][1], tickets, cnt + 1);
visited[i] = false; // DFS를 빠져나온 후 방문 표시 해제
}
}
}
}
주석을 달며 문제를 해결하니 꽤 시간이 걸렸다.
그래도 코드가 어떻게 동작하는지 자세히 알 수 있게 되어 dfs에 대해 이해할 수 있는 계기가 되었다.
'Algorithm' 카테고리의 다른 글
Algorithm - 백준 벡터 매칭 (0) | 2024.04.16 |
---|---|
Algorithm - 백준 도키도키 간식드리미(자료구조, 스택) (0) | 2024.04.04 |
Algorithm - 프로그래머스 섬 연결하기(Greedy, Minimum Spanning Tree, Union Find) (0) | 2024.04.01 |
Algorithm - 백준 DNA 비밀번호(12891), 슬리이딩 윈도우 (0) | 2024.03.26 |
프로그래머스 : 양옆앞뒤 큰 수 찾기 (0) | 2023.06.22 |