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
- Spring #Java #Spring Boot #@BeforeEach #@AfterEach
- sequelize
- Spring #Java #Spring Boot
- 7568
- 2447
- kakaocloudschool
- Spring #Java #Spring Boot #싱글톤
- 15552
- 카카오 클라우드 스쿨
- 11053
- boj
- 9020
- 알고리즘
- 1110
- 24479
- Spring #Spring Boot #Java
- 코딩테스트
- kakaocloud
- node
- Java #백준 #코딩테스트
- Spring
- 백준
- 11054
- SpringTokenizer
- java
- 카카오클라우드스쿨
- python
- Java #오븐시계 #백준
- Java #코딩테스트
- 파이썬
Archives
- Today
- Total
YoungSoo
백준 - 알고리즘 수업 - 깊이 우선 탐색 1(24479번 Python 풀이) 본문
이 문제는 알고리즘 유형 중 DFS를 통해 푸는 문제이다
깊이 우선 탐색(DFS, Depth-First Search)은 최대한 깊게 내려갔다가 더 이상 갈 수 없다면 다시 가장 가까운 갈림길로 돌아가 다른 방향을 탐색하는 깊이 우선 탐색 방식이다. 보통 스택 또는 재귀함수로 문제 풀이를 하며 모든 정점을 방문하거나 경로의 특징을 저장해야하는 문제는 DFS를 사용해 풀면 좋습니다.
import sys
sys.setrecursionlimit(10**9)
input = sys.stdin.readline
n, m, r = map(int, input().split())
v=[0] * (n+1)
graph=[[] for i in range(n+1)]
cnt=1
for i in range(m):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
def dfs(r):
global cnt
v[r] = cnt
graph[r].sort()
for x in graph[r]:
if v[x] == 0:
cnt+=1
dfs(x)
dfs(r)
for i in range(1, n+1):
print(v[i])
문제를 풀면서 계속 같은 오류가 발생했는데 알고보니 런타임 에러 (RecursionError)이 떴고 그 이유는 Python이 정한 재귀 깊이를 넘어서 그런 것이었고 이 문제 때문에 계속 오류가 났었다. 자세한 내용은 https://help.acmicpc.net/judge/rte/RecursionError 이 페이지를 참고하면 좋을 것 같다.
또한 이것의 풀이는 먼저 하나의 이차원 배열을 만들어준 뒤 각자 간선의 정보를 통해 갈 수 각 인덱스 번호에서 갈 수 있는 곳을 모두 넣어준다. 함수에서 오름차순으로 정렬을 해주고 각 정점에는 몇 번째 순서로 방문했는지 체크해주고 마지막에 출력을 합니다.
'코딩테스트' 카테고리의 다른 글
프로그래머스 - 가장 긴 펠린드롬(Python 풀이) (0) | 2023.03.09 |
---|---|
백준 - 숨바꼭질 3(13549 Python 풀이) (0) | 2023.02.26 |
백준 - 가장 긴 증가하는 부분 수열2(12015 Python 풀이) (0) | 2023.02.09 |
백준 - 행렬 제곱(10830 Python 풀이) (0) | 2023.02.03 |
백준 - 색종이 만들기(2630번 Python 풀이) (0) | 2023.01.30 |