Skip to content

Commit cc2a02b

Browse files
authored
Merge pull request #150 from AlgorithmStudy-Allumbus/minjeong
Minjeong / 3μ›” 1μ£Όμ°¨ / 5문제
2 parents a0d3b51 + b4e1daa commit cc2a02b

6 files changed

+159
-1
lines changed

β€Ž_WeeklyChallenges/W13-[Union-Find]/Assignment_BOJ_1717_μ§‘ν•©μ˜ν‘œν˜„.pyβ€Ž

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,36 @@
44
μœ ν˜•: Union-Find, Graph
55
'''
66

7-
# PR 올릴 λ•Œ 과제 μ •λ‹΅ 곡개 μ˜ˆμ •
7+
import sys
8+
sys.setrecursionlimit(10 ** 6) # μž¬κ·€ 깊이 μ œν•œ 늘리기
9+
input = sys.stdin.readline
10+
11+
# Union μ—°μ‚°(두 집합을 ν•©μΉ˜κΈ° μœ„ν•œ ν•¨μˆ˜)
12+
def union(a, b):
13+
p_a = find(a)
14+
p_b = find(b)
15+
16+
if p_a > p_b: # 값이 더 μž‘μ€ μͺ½μ„ λΆ€λͺ¨λ‘œ μ„€μ •
17+
parent[p_a] = p_b
18+
else:
19+
parent[p_b] = p_a
20+
21+
# Find μ—°μ‚°(같은 집합에 μ†ν•˜λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•œ ν•¨μˆ˜)
22+
def find(a):
23+
if a != parent[a]:
24+
parent[a] = find(parent[a]) # 경둜 μ••μΆ•
25+
return parent[a]
26+
27+
# μ—°μ‚° μˆ˜ν–‰
28+
n, m = map(int, input().split())
29+
parent = [i for i in range(n + 1)] # 초기: 각 μ›μ†Œκ°€ 자기 μžμ‹ μ„ λΆ€λͺ¨λ‘œ 가짐
30+
31+
for _ in range(m):
32+
flag, a, b = map(int, input().split())
33+
if flag == 0: # ν•©μ§‘ν•© μ—°μ‚°
34+
union(a, b)
35+
else: # 같은 μ§‘ν•© 확인 μ—°μ‚°
36+
if find(a) == find(b):
37+
print("YES")
38+
else:
39+
print("NO")
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import sys
2+
import heapq
3+
input = sys.stdin.readline
4+
5+
n = int(input())
6+
heap = []
7+
8+
while n > 0:
9+
num = int(input())
10+
n -= 1
11+
if num == 0:
12+
if len(heap) == 0:
13+
print(0)
14+
continue
15+
print(-heapq.heappop(heap))
16+
else:
17+
heapq.heappush(heap, -num)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import sys
2+
import heapq
3+
input = sys.stdin.readline
4+
5+
n = int(input())
6+
abs_heap = []
7+
8+
for _ in range(n):
9+
num = int(input())
10+
if num == 0:
11+
if abs_heap:
12+
print(heapq.heappop(abs_heap)[1])
13+
else:
14+
print(0)
15+
else:
16+
heapq.heappush(abs_heap, (abs(num), num))
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import sys
2+
import heapq
3+
input = sys.stdin.readline
4+
5+
n = int(input())
6+
heap = []
7+
8+
for _ in range(n):
9+
num = int(input())
10+
n -= 1
11+
if num == 0:
12+
if len(heap) == 0:
13+
print(0)
14+
continue
15+
print(heapq.heappop(heap))
16+
else:
17+
heapq.heappush(heap, num)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import sys
2+
sys.setrecursionlimit(10 ** 6) # μž¬κ·€ 깊이 μ œν•œ 늘리기
3+
input = sys.stdin.readline
4+
5+
# Union μ—°μ‚°(두 집합을 ν•©μΉ˜κΈ° μœ„ν•œ ν•¨μˆ˜)
6+
def union(a, b):
7+
p_a = find(a)
8+
p_b = find(b)
9+
10+
if p_a > p_b: # 값이 더 μž‘μ€ μͺ½μ„ λΆ€λͺ¨λ‘œ μ„€μ •
11+
parent[p_a] = p_b
12+
else:
13+
parent[p_b] = p_a
14+
15+
# Find μ—°μ‚°(같은 집합에 μ†ν•˜λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•œ ν•¨μˆ˜)
16+
def find(a):
17+
if a != parent[a]:
18+
parent[a] = find(parent[a]) # 경둜 μ••μΆ•
19+
return parent[a]
20+
21+
# μ—°μ‚° μˆ˜ν–‰
22+
n, m = map(int, input().split())
23+
parent = [i for i in range(n + 1)] # 초기: 각 μ›μ†Œκ°€ 자기 μžμ‹ μ„ λΆ€λͺ¨λ‘œ 가짐
24+
25+
for _ in range(m):
26+
flag, a, b = map(int, input().split())
27+
if flag == 0: # ν•©μ§‘ν•© μ—°μ‚°
28+
union(a, b)
29+
else: # 같은 μ§‘ν•© 확인 μ—°μ‚°
30+
if find(a) == find(b):
31+
print("YES")
32+
else:
33+
print("NO")
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import sys
2+
sys.setrecursionlimit(10 ** 8)
3+
input = sys.stdin.readline
4+
5+
def union(a, b):
6+
p_a = find(a)
7+
p_b = find(b)
8+
9+
if p_a > p_b: # a의 λŒ€ν‘œλ³΄λ‹€ b의 λŒ€ν‘œκ°€ 더 μž‘μ€ 값을 κ°€μ§€λ©΄,
10+
parent[p_a] = p_b # aκ°€ μ†ν•œ 집합을 b의 집합에 ν•©μΉ˜κΈ°
11+
else:
12+
parent[p_b] = p_a # κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ b의 집합을 a의 집합에 ν•©μΉ˜κΈ°
13+
14+
def find(a):
15+
if a == parent[a]: # aκ°€ 자기 μžμ‹ μ˜ λΆ€λͺ¨μ΄λ©΄ λŒ€ν‘œ λ…Έλ“œ
16+
return a
17+
18+
parent[a] = find(parent[a]) # 경둜 압좕을 톡해 a의 λΆ€λͺ¨λ₯Ό λŒ€ν‘œ λ…Έλ“œλ‘œ μž¬μ„€μ •
19+
return parent[a]
20+
21+
# λ„μ‹œμ˜ 개수 nκ³Ό μ—¬ν–‰ κ³„νšμ— ν¬ν•¨λœ λ„μ‹œμ˜ 수 m을 μž…λ ₯λ°›κΈ°
22+
n = int(input())
23+
m = int(input())
24+
25+
parent = [i for i in range(n)] # 각 λ„μ‹œλŠ” μ²˜μŒμ— 자기 μžμ‹ μ΄ λŒ€ν‘œ λ…Έλ“œ.
26+
27+
# n개의 쀄에 걸쳐 λ„μ‹œ κ°„ μ—°κ²° 정보λ₯Ό μž…λ ₯λ°›κ³ , μ—°κ²°λ˜μ–΄ 있으면 union μ—°μ‚° μˆ˜ν–‰
28+
for i in range(n):
29+
arr = list(map(int, input().split()))
30+
for j in range(n):
31+
if arr[j]: # 1이면 i와 jκ°€ μ—°κ²°λ˜μ–΄ μžˆμœΌλ―€λ‘œ union μ—°μ‚° μˆ˜ν–‰
32+
union(i, j)
33+
34+
# μ—¬ν–‰ κ³„νšμ„ μž…λ ₯
35+
plan = list(map(int, input().split()))
36+
result = "YES"
37+
# μ—¬ν–‰ κ³„νšμ— μžˆλŠ” λͺ¨λ“  λ„μ‹œκ°€ 같은 μ§‘ν•©(λŒ€ν‘œ λ…Έλ“œ)을 κ°€μ§€λŠ”μ§€ 확인
38+
for i in range(1, m):
39+
if parent[plan[i]-1] != parent[plan[0]-1]:
40+
result = "NO"
41+
break
42+
43+
print(result)

0 commit comments

Comments
Β (0)