250x250
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- 스프링 컨테이너
- 파이썬 리스트 메서드
- BFS
- 클래스 로더 계층
- 2026 AWS SAA-C03
- 코딩테스트
- 다이렉트 레퍼런스
- python
- 어플리케이션 클래스 로더
- aws saa-c03
- java
- 스프링
- Spring
- 플랫폼 클래스 로더
- python list method
- 알고리즘
- 자바
- 심볼릭 레퍼런스
- 자료구조
- 객체지향
- AWS SAA-C03 합격후기
- stop the world
- 딕셔너리
- dfs
- 부트스트랩 클래스 로더
- 컴포넌트 스캔
- 파이썬
- 백준
- getreference
- 파이썬 문자열 메서드
Archives
- Today
- Total
클라우드 낚시꾼
[백준] 13023번 ABCDE - DFS 풀이 + 반례 (Python3) 본문
728x90

제한 조건과 설계

- N이 2000이하이므로 DFS를 쓸 수 있음.
- 무방향 그래프.
- 시간 제한과 메모리 제한도 넉넉하다.
- DFS 탐색으로, 문제의 조건을 만족 시켜야 한다.
자연어 알고리즘
- 그래프 생성, 방문 테이블, 노드 목록 생성
- 각각의 노드를 시작 지점으로 DFS 탐색
- DFS 탐색
- 1) 탐색 노드 방문 처리 후, route에 탐색 노드 push
- 2) route의 길이가 5이면 -> 1을 출력하고 종료
- 3) 인접 노드 중 아직 방문하지 않은 노드가 있다면 -> 그 인접 노드로 DFS 탐색
- 4) 인접 노드 모두를 방문했다면 -> route에서 현재 탐색 노드를 pop 한 뒤, 미방문 처리
- 1 ~ 3 이 종료될때 까지 반복
- 0 출력 후 종료( ABCDE 관계가 나왔다면 3-(2)에서 종료)
코드
import sys
sys.setrecursionlimit(10**4)
input = sys.stdin.readline
n,m = map(int, input().split())
nodes = [n for n in range(n)]
graph = [[] for _ in range(n)]
for i in range(m):
u,v = map(int, input().split())
graph[u].append(v)
graph[u].sort()
graph[v].append(u)
graph[v].sort()
def dfs(graph, i, visited, route):
visited[i] = True
route.append(i)
if len(route) == 5:
print(1)
exit()
for j in graph[i]:
if not visited[j]:
dfs(graph,j,visited,route)
visited[route.pop()] = False
for i in nodes:
visited = [None] * (n)
dfs(graph,i,visited, [])
print(0)
(반례) 이미 방문된 노드가 나중에 재방문 될 것을 대비하여 방문을 미방문으로 처리

필자 같은 경우에는 인접 노드가 여러 개 일때, 작은 노드를 먼저 방문하는 방식을 택했다. 이 방식에 따르면 이동 경로는 아래와 같다.
(시작: 0)
0->1
0->1->3
0->1->3->2
0->1->3
0->1
0->1->4
0->1->4->3
0->1->4->3->2 (A-B-C-D-E 관계)
위와 같은 과정으로 문제의 답이 찾아진다.
위 그래프에서 1과 같이 인접한 노드가 2개 이상인 경우 그 노드 중 한 노드가 방문됬다 하더라도 나중에 다시 재방문 될 수 있기에 꼭 다시 미방문 처리가 되어야 한다. 예를 들자면, 0->1->3->2 까지 갔다가 더 이상 방문할 곳이 없어 0->1로 되돌아 와서 0->1->4까지 왔을 때 3은 다시 재방문 된다. 이때, 만약 3이 재방문 되는데 이미 방문 처리 되어 있다면 3를 다시 방문하지 못한다.
따라서, 0->1->3->2에서 0->1->3으로 되돌아 갈때 반드시 2에 대해서 미방문 처리가 되어야 하며, 0->1->3에서 0->1로 되돌아 갈때도 마찬가지로 반드시 3에 대한 미방문 처리가 되어야 한다. 이렇게 해야만 나중에 다른 경로를 통해 2, 3을 재방문 할 수 있다.
세 줄 요약
- 노드를 방문하면, 그 노도는 방문 처리되어야 한다.
- DFS 탐색 시 이전 노드로 다시 되돌아 갈 때, 방문에서 미방문으로 재설정해야 하는 문제도 있다.
- 노드와 노드 사이의 연결 관계, 이동 거리 문제는 DFS가 BEST WAY.
728x90
'CodingTest > 문제풀이' 카테고리의 다른 글
| [백준] 18352번 특정 거리의 도시 찾기 - BFS(Python3) (1) | 2023.12.29 |
|---|---|
| [백준] 2644번 촌수계산 - DFS (Python3) (0) | 2023.12.28 |
| [백준] 11724번 연결 요소의 개수 - DFS(stack, 재귀함수) (Python3) (0) | 2023.12.27 |
| [백준] 4963번 섬의 개수 - BFS 풀이 (Python3) (2) | 2023.12.27 |
| [백준] 1012번 유기농 배추 - BFS 풀이(Python3) (0) | 2023.12.24 |