https://www.acmicpc.net/problem/25195
# 학습 키워드
1. 그래프 탐색
그래프를 순회하면서 연결된 노드를 탐색하는 기법
2. 깊이우선 탐색 (DFS)
재귀나 스택을 통해 한 경로를 끝까지 탐색하고, 백트래킹하여 다른 경로를 탐색하는 방법
3. 백트래킹
특정 조건을 만족하지 않는 경로를 중간에 포기하고 돌아오는 기법
# 문제 접근 방식
1. 주어진 문제는 특정 시작점에서 목적지까지의 이동 가능 여부를 판단하는 문제로, 그래프 탐색 알고리즘 중 하나인 dfs를 사용하는 것이 적합하다.
2. 특정 정점(곰이 있는 위치)으로는 이동할 수 없으므로 이를 확인하기 위해 별도의 리스트나 딕셔너리로 곰이 위치한 노드를 기록해두어야 한다.
3. 각 노드 방문 여부를 기록하여 dfs 과정에서 사이클을 방지한다
4. 마지막 노드까지 도달했을 때 (즉, 더 이상 탐색할 연결 노드가 없을 때) yes를 출력하고 종료해야 한다
# 코드 작성
import sys
input = sys.stdin.readline
sys.setrecursionlimit(100001)
def dfs(now_v):
if visited[now_v] or now_v in is_bear:
return
visited[now_v] = True
if not graph[now_v]:
print("yes")
exit(0)
for next_v in graph[now_v]:
if next_v not in is_bear and not visited[next_v]:
dfs(next_v)
visited[next_v] = False
if __name__ == "__main__":
N, M = map(int, input().split())
graph = [[] for _ in range(N + 1)]
visited = [False] * (N + 1)
for _ in range(M):
v1, v2 = map(int, input().split())
graph[v1].append(v2)
S = int(input())
is_bear = {}
s = list(map(int, input().split()))
for _s in s:
is_bear[_s] = True
dfs(1)
print("Yes")
# 회고
1. 재귀 깊이 설정의 필요성
노드가 최대 100,000개까지 가능하므로 기본 재귀 깊이 제한(1,000)으로는 부족하다. sys.setrecursionlimit(100001)로 제한을 늘려줘야 RecursionError 없이 DFS 탐색을 할 수 있었다. 파이썬에서 DFS로 깊은 그래프를 탐색할 때는 필수적인 설정임을 다시 확인하였다.
2. 백트래킹을 통한 방문 초기화
DFS에서 특정 경로 탐색 후, 다른 경로도 탐색할 수 있도록 방문 상태를 초기화(visited[next_v] = False)하였다. 백트래킹을 적용하지 않으면 경로 접근이 제한되어 잘못된 결과를 출력할 수 있다. 이번 문제를 통해 DFS의 백트래킹이 정확한 탐색을 위한 핵심이라는 것을 다시 배웠다.
3. 곰이 있는 위치 관리 방법
곰이 있는 노드를 리스트 대신 딕셔너리로 관리하여, 접근 제한 여부를 평균 상수 시간(O(1))에 확인할 수 있도록 최적화하였다. 곰이 위치한 노드가 많을수록 리스트보다 딕셔너리가 훨씬 효율적이었으며, 문제 조건에 맞게 자료구조를 선택하는 것이 코드 효율성에 크게 기여함을 실감하였다.
4. 종료 조건 설정의 효과
경로 끝에 도달하거나 더 이상 이동할 수 없는 경우 바로 "yes"를 출력하고 종료하도록 하여 불필요한 탐색을 줄였다. 중간에 탐색을 종료함으로써 대규모 데이터에서 성능을 높일 수 있는 방법을 다시 상기하였다.
단순한 DFS 구현에서 더 나아가 탐색 조건 설정과 자료구조 선택의 중요성을 체감하였다. 최적화된 탐색을 위해서는 문제 조건에 맞는 자료구조와 종료 조건 설정이 필수적임을 깨달았고, 앞으로도 이러한 부분에 유의하며 코딩할 것이다.
'대외활동 > 항해99' 카테고리의 다른 글
99클럽 코테 스터디 10일차 - 백준 18352번 특정 거리의 도시 찾기 [Python] (7) | 2024.11.06 |
---|---|
99클럽 코테 스터디 8일차 - 백준 2644번 촌수계산 [Python] (4) | 2024.11.04 |
99클럽 코테 스터디 5일차 TIL - 백준 2444번 알고리즘수업 너비우선탐색 1 [Python] (1) | 2024.11.01 |
99클럽 코테 스터디 4일차 TIL - 백준 24475번 알고리즘수업 깊이우선탐색1 [Python] (1) | 2024.10.31 |
99클럽 코테 스터디 3일차 TIL - 프로그래머스 입국심사 [Python] (0) | 2024.10.30 |