타잔 알고리즘 (Tarjan's Algorithm)
개념
타잔 알고리즘은 그래프에서 **강하게 연결된 컴포넌트(SCC, Strongly Connected Components)**를 찾는 알고리즘입니다.
- DFS 기반으로 동작하며, 각 노드의 발견 순서(low-link value)를 이용합니다.
- 방향 그래프에서 SCC를 탐색하는 데 유용합니다.
문제
- Critical Connections in a Network (LeetCode 1192)
설명: 네트워크에서 단일 연결을 끊으면 그래프가 분리되는 간선을 찾습니다.
핵심 개념: Tarjan's Algorithm, DFS. - Strongly Connected Components (Custom Problem - 구현 필요)
설명: 방향 그래프에서 모든 SCC를 탐지합니다.
핵심 개념: Tarjan Algorithm, DFS.
플로이드-워셜 알고리즘 (Floyd-Warshall Algorithm)
개념
플로이드-워셜 알고리즘은 그래프에서 모든 쌍의 최단 경로를 계산하는 알고리즘입니다.
- 동적 프로그래밍을 사용하며, 가중치가 음수일 수도 있습니다(음수 사이클은 허용하지 않음).
- 인접 행렬 표현의 그래프에 적합합니다.
문제
- All Pairs Shortest Path (Custom Problem - 구현 필요)
설명: 방향 또는 무방향 그래프에서 모든 노드 쌍 간의 최단 경로를 계산합니다.
핵심 개념: 플로이드-워셜 알고리즘. - Network Delay Time (LeetCode 743)
설명: 네트워크에서 신호가 모든 노드에 도달하는 데 걸리는 시간을 계산합니다.
핵심 개념: 그래프 탐색, 플로이드-워셜 가능. - City With the Smallest Number of Neighbors (LeetCode 1334)
설명: 모든 도시에서 특정 거리 내에서 접근할 수 있는 도시의 수를 계산합니다.
핵심 개념: 플로이드-워셜 또는 다익스트라.
Kosaraju Algorithm
개념
Kosaraju 알고리즘은 방향 그래프에서 SCC를 탐지하는 또 다른 알고리즘입니다.
- 두 번의 DFS를 수행합니다.
- 그래프의 역순(topological order)을 구함.
- 역 그래프(reverse graph)에서 SCC를 탐지.
문제
- Find SCC in Directed Graph (Custom Problem - 구현 필요)
설명: 방향 그래프의 모든 SCC를 탐지합니다.
핵심 개념: Kosaraju Algorithm, DFS. - Connected Components in Graph (LeetCode 323)
설명: 그래프의 연결 요소의 수를 계산합니다(방향성이 없는 그래프).
핵심 개념: DFS, Union-Find (Kosaraju 알고리즘과 변형 가능).
다익스트라 알고리즘 (Dijkstra's Algorithm)
개념
다익스트라 알고리즘은 단일 시작점에서 모든 노드까지의 최단 경로를 찾습니다.
- BFS의 우선순위 큐(최소 힙) 버전입니다.
- 음수 가중치는 허용되지 않습니다.
문제
- Network Delay Time (LeetCode 743)
설명: 시작 노드에서 모든 노드에 신호가 도달하는 데 걸리는 시간을 계산합니다.
핵심 개념: 다익스트라 알고리즘. - Cheapest Flights Within K Stops (LeetCode 787)
설명: K번 이하의 스탑으로 목적지까지 가는 가장 저렴한 경로를 찾습니다.
핵심 개념: 다익스트라 알고리즘.
벨만-포드 알고리즘 (Bellman-Ford Algorithm)
개념
벨만-포드는 음수 가중치를 포함하는 그래프에서 단일 시작점에서 최단 경로를 찾습니다.
- 모든 간선을 반복적으로 업데이트합니다.
- 음수 사이클도 감지할 수 있습니다.
문제
- Detect Negative Weight Cycle (Custom Problem - 구현 필요)
설명: 그래프에 음수 가중치 사이클이 있는지 감지합니다.
핵심 개념: 벨만-포드 알고리즘. - Find Minimum Cost Path (Custom Problem - 구현 필요)
설명: 시작 노드에서 특정 노드까지의 최소 비용 경로를 찾습니다.
핵심 개념: 벨만-포드 알고리즘.
위상정렬 (Topological Sorting)
개념
위상정렬은 **DAG(Directed Acyclic Graph)**에서 노드 순서를 구하는 방법입니다.
- 간선 방향에 따라 선행 조건이 만족되도록 순서를 정합니다.
문제
- Course Schedule II (LeetCode 210)
설명: 주어진 코스의 순서를 출력합니다.
핵심 개념: 위상정렬, DFS, BFS. - Alien Dictionary (LeetCode 269 - Premium)
설명: 외계어 사전의 단어 순서를 결정합니다.
핵심 개념: 위상정렬, 그래프. - Parallel Courses (LeetCode 1136)
설명: 모든 코스를 완료하는 데 필요한 최소 학기 수를 계산합니다.
핵심 개념: 위상정렬, BFS.
싸이클이 없는 모든 경로를 출력
- All Paths From Source to Target (LeetCode 797)
설명: 방향 그래프에서 시작점부터 도착점까지의 모든 경로를 출력합니다.
핵심 개념: DFS, 백트래킹. - Paths with Minimum Effort (LeetCode 1631)
설명: 각 경로에서 최소 노력을 필요로 하는 모든 경로를 찾습니다.
핵심 개념: BFS, 다익스트라.
싸이클이 없는 모든 경로 중 가장 짧은 경로를 찾는 문제
- Cheapest Flights Within K Stops (LeetCode 787)
설명: 주어진 그래프에서 K번 이내의 스탑으로 가장 저렴한 경로를 찾습니다.
핵심 개념: 다익스트라, BFS. - Minimum Cost to Make at Least One Valid Path in a Grid (LeetCode 1368)
설명: 격자에서 유효한 경로를 구성하는 데 필요한 최소 비용을 계산합니다.
핵심 개념: BFS, 다익스트라.
싸이클이 없는 모든 경로 중 가장 긴 경로를 찾는 문제 (Brute-Force 방식, Backtracking)
- Longest Path in a Directed Acyclic Graph (Custom Problem - 구현 필요)
설명: DAG에서 모든 경로를 탐색하며 가장 긴 경로를 찾는 문제입니다.
핵심 개념: DFS, 백트래킹.
참고: 이 문제는 일반적인 LeetCode 문제로 제공되지 않지만, 그래프 탐색과 백트래킹을 연습할 수 있습니다. - Longest Increasing Path in a Matrix (LeetCode 329)
설명: 2D 행렬에서 증가하는 경로 중 가장 긴 길이를 찾습니다.
핵심 개념: DFS, 백트래킹, 메모이제이션.
방향이 있고 싸이클이 없는 그래프(DAG) + 위상정렬 사용하는 문제
- Course Schedule II (LeetCode 210)
설명: 주어진 코스의 순서를 출력합니다.
핵심 개념: 위상정렬, BFS, DFS. - Minimum Height Trees (LeetCode 310)
설명: 그래프에서 최소 높이를 가지는 루트 노드를 찾습니다.
핵심 개념: 위상정렬, 그래프. - Parallel Courses (LeetCode 1136)
설명: 모든 코스를 완료하는 데 필요한 최소 학기 수를 계산합니다.
핵심 개념: 위상정렬, BFS. - Alien Dictionary (LeetCode 269 - Premium)
설명: 외계어 사전의 순서를 결정합니다.
핵심 개념: 위상정렬, 그래프. - Find Eventual Safe States (LeetCode 802)
설명: 그래프에서 터미널 상태로 도달할 수 있는 모든 노드를 찾습니다.
핵심 개념: 위상정렬, DFS.
추가 백트래킹 연습 문제
- N-Queens (LeetCode 51)
설명: N×N 체스판에서 N개의 퀸을 서로 공격하지 않도록 배치하는 모든 방법을 찾습니다.
핵심 개념: 백트래킹. - Sudoku Solver (LeetCode 37)
설명: 주어진 스도쿠 퍼즐을 해결합니다.
핵심 개념: 백트래킹. - Word Search II (LeetCode 212)
설명: 단어 목록에 있는 단어들을 격자에서 찾습니다.
핵심 개념: 백트래킹, 트라이(Trie). - Generate Parentheses (LeetCode 22)
설명: 균형 잡힌 괄호의 모든 조합을 생성합니다.
핵심 개념: 백트래킹. - Combination Sum II (LeetCode 40)
설명: 중복을 포함하지 않는 숫자의 조합으로 목표 합을 생성합니다.
핵심 개념: 백트래킹.
추가 그래프 DFS/BFS 탐색 문제
- Surrounded Regions (LeetCode 130)
설명: 2D 격자에서 "O"를 "X"로 변환하며 경계 조건을 고려합니다.
핵심 개념: DFS, BFS. - Pacific Atlantic Water Flow (LeetCode 417)
설명: 물이 태평양과 대서양 모두로 흐를 수 있는 모든 격자를 찾습니다.
핵심 개념: DFS, BFS. - Redundant Connection (LeetCode 684)
설명: 그래프에서 사이클을 형성하는 간선을 찾습니다.
핵심 개념: DFS, 유니온 파인드. - Clone Graph (LeetCode 133)
설명: 그래프를 복제합니다.
핵심 개념: DFS, BFS. - Network Delay Time (LeetCode 743)
설명: 네트워크에서 모든 노드로 신호가 도달하는 데 걸리는 시간을 계산합니다.
핵심 개념: 다익스트라, 그래프.
추가 위상정렬 기반 문제
- Reconstruct Itinerary (LeetCode 332)
설명: 항공권 리스트를 사용해 여행 일정을 재구성합니다.
핵심 개념: 위상정렬, DFS. - Sequence Reconstruction (LeetCode 444 - Premium)
설명: 여러 시퀀스가 주어질 때 고유한 원본 순서를 복원할 수 있는지 확인합니다.
핵심 개념: 위상정렬, 그래프. - Longest Path in Directed Acyclic Graph (DAG) (Custom Problem - 구현 필요)
설명: 방향성이 있고 싸이클이 없는 그래프에서 가장 긴 경로를 찾습니다.
핵심 개념: DFS, DP. - Course Schedule III (LeetCode 630)
설명: 제한 시간 내 최대 과목을 완료하는 방법을 찾습니다.
핵심 개념: 위상정렬, 힙.
추가 심화 문제
- Critical Connections in a Network (LeetCode 1192)
설명: 네트워크에서 단일 연결을 끊으면 네트워크가 분리되는 간선을 찾습니다.
핵심 개념: 그래프, 타잔 알고리즘. - Strongly Connected Components (Custom Problem - 구현 필요)
설명: 방향 그래프에서 강하게 연결된 컴포넌트를 찾습니다.
핵심 개념: Kosaraju 또는 Tarjan 알고리즘.
'Coding Test > 알고리즘 이론' 카테고리의 다른 글
해밀턴 순회 및 경로 문제 (1) | 2025.01.06 |
---|---|
경로문제 || (25) (0) | 2025.01.06 |
안정적인 짝짓기 문제 (Stable Matching) 20+20 (1) | 2025.01.06 |
Bipartite Graph 이분 그래프 문제 20+20 (1) | 2025.01.05 |
짝짓기 문제(Pairing) 20+20 (0) | 2025.01.05 |