어디까지 갈 수 있을까?
[Union-Find] 백준 10775 공항 본문
문제링크 www.acmicpc.net/problem/10775
고통의 시간을 거치고 드디어 맞았다!! 🎉👏🎉👏
[답코드]
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
32
33
34
35
36
37
38
39
40
41
|
import sys
input=sys.stdin.readline
sys.setrecursionlimit(10**6) # 최대 재귀 깊이 제한 늘림
# 특정 원소가 속한 집합을 찾기
def find_parent(parent, x):
# 루트 노드가 아니라면, 루트 노드를 찾을 때까지 재귀적으로 호출
if parent[x] != x:
parent[x] = find_parent(parent, parent[x])
return parent[x]
# 두 원소가 속한 집합을 합치기
def union_parent(parent, a):
a = find_parent(parent, a)
b = a-1
if b<0:
return -1
if a < b:
parent[b] = a
else:
parent[a] = b
return 0
# 노드의 개수와 간선(Union 연산)의 개수 입력 받기
v=int(input())
e=int(input())
parent = [0] * (v + 1) # 부모 테이블 초기화하기
# 부모 테이블상에서, 부모를 자기 자신으로 초기화
for i in range(1, v + 1):
parent[i] = i
result=0
# Union 연산을 각각 수행
for i in range(e):
a=int(input())
if union_parent(parent, a)<0:
break
result += 1
print(result)
|
cs |
[풀이법]
① 최대 재귀 깊이 늘리기
파이썬은 재귀 호출 제한이 1000번까지라고 한다. 이를 늘려줘야 런타임 에러가 안 난다
② 흐름
입력값이 들어오면 union_parent를 진행한다.
입력값 a의 parent 노드를 찾아 (a의 parent노드)와 (a의 parent노드-1)을 합쳐준다
여기서 parent에 입력할 숫자의 범위는 0까지여야 하므로 b값이 0미만이면 break 한다
③ 출력(예제1)
입력값 | 4 3 4 1 1 |
초기화 | |
입력 4, union(4, 3) | |
입력 1, union(1, 0) | |
입력 1, union(0, -1) | break *b가 0 미만 |
④ 출력(예제2)
입력값 | 4 6 2 2 3 3 4 4 |
초기화 | |
입력 2, union(2, 1) | |
입력 2, union(1, 0) | |
입력 3, union(3, 1) | |
입력 3, union(0, -1) | break *b가 0 미만 |
728x90
'알고리즘 > 문제' 카테고리의 다른 글
[구현] 프로그래머스 문자열 압축 (1) | 2021.03.05 |
---|---|
[그리디] 프로그래머스 무지의 먹방 라이브 (0) | 2021.03.04 |
[플로이드 워셜] 백준 2224 명제 증명 (0) | 2021.02.27 |
[플로이드 워셜] 백준 11403 경로 찾기 (0) | 2021.02.27 |
[이분탐색] 백준 7795 먹을 것인가 먹힐 것인가 (0) | 2021.02.19 |
Comments