์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- 2024-08-20
- di
- 2024-08-21
- Android Studio
- datepicker
- FACTORY
- OOP
- AndroidStudio
- http method
- ์ฑ์ฉํ์ ํ
- ์ฝ๋์
- swagger
- Dialog
- IOC
- Python
- OpenAPI
- ์ด๋ ธํ ์ด์
- Factory Method Pattern
- reflection
- ํ๋ IT&E
- fontstyle
- URN
- menutab
- Kotlin
- tcp
- ๊ธฐ์ด100์
- uri
- url
- ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ
- udp
dingdong coding
[ ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ ] ๊ธฐํ ๊ทธ๋ํ ์ด๋ก ๋ณธ๋ฌธ
[ ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ ] ๊ธฐํ ๊ทธ๋ํ ์ด๋ก
๐ถ ๊ฐ๋ฐ๊ฐ๋ฐ ๐พ 2022. 6. 15. 10:27
• ์๋ก์ ์งํฉ (Disjoint Sets) : ๊ณตํต ์์๊ฐ ์๋ ๋ ์งํฉ์ ์๋ฏธํฉ๋๋ค.
• ์๋ก์ ๋ถ๋ถ ์งํฉ๋ค๋ก ๋๋์ด์ง ์์๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค.
• ์๋ก์ ์งํฉ ์๋ฃ๊ตฌ์กฐ๋ ๋ ์ข ๋ฅ์ ์ฐ์ฐ์ ์ง์ํฉ๋๋ค.
• ํฉ์งํฉ(Union) : ๋ ๊ฐ์ ์์๊ฐ ํฌํจ๋ ์งํฉ์ ํ๋์ ์งํฉ์ผ๋ก ํฉ์น๋ ์ฐ์ฐ์ ๋๋ค.
• ์ฐพ๊ธฐ(Find) : ํน์ ํ ์์๊ฐ ์ํ ์งํฉ์ด ์ด๋ค ์งํฉ์ธ์ง ์๋ ค์ฃผ๋ ์ฐ์ฐ์ ๋๋ค.
• ์๋ก์ ์งํฉ ์๋ฃ๊ตฌ์กฐ๋ ํฉ์น๊ธฐ ์ฐพ๊ธฐ(Union Find) ์๋ฃ๊ตฌ์กฐ๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํฉ๋๋ค.
• ์ฌ๋ฌ ๊ฐ์ ํฉ์น๊ธฐ ์ฐ์ฐ์ด ์ฃผ์ด์ก์ ๋ ์๋ก์ ์งํฉ ์๋ฃ๊ตฌ์กฐ์ ๋์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ํฉ์งํฉ(Union) ์ฐ์ฐ์ ํ์ธํ๋ฉฐ, ์๋ก ์ฐ๊ฒฐ๋ ๋ ๋ ธ๋ A, B๋ฅผ ํ์ธํฉ๋๋ค.
1) A์ B์ ๋ฃจํธ ๋ ธ๋ A', B' ๋ฅผ ๊ฐ๊ฐ ์ฐพ์ต๋๋ค.
2) A'๋ฅผ B'์ ๋ถ๋ชจ๋ ธ๋๋ก ์ค์ ํฉ๋๋ค.
2. ๋ชจ๋ ํฉ์งํฉ(Union) ์ฐ์ฐ์ ์ฒ๋ฆฌํ ๋๊น์ง 1๋ฒ์ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
1. ๊ธฐ๋ณธ์ ์ธ ์๋ก์ ์งํฉ ๊ตฌํ ๋ฐฉ๋ฒ
# ๊ธฐ๋ณธ์ ์ธ ์๋ก์ ์งํฉ ์๊ณ ๋ฆฌ์ฆ
# ํน์ ์์๊ฐ ์ํ ์งํฉ์ ์ฐพ๊ธฐ
def find_parent(parent, x):
# ๋ฃจํธ ๋
ธ๋๊ฐ ์๋๋ผ๋ฉด, ๋ฃจํธ ๋
ธ๋๋ฅผ ์ฐพ์ ๋๊น์ง ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
if parent[x] != x:
return find_parent(parent, parent[x])
return x
# ๋ ์์๊ฐ ์ํ ์งํฉ์ ํฉ์น๊ธฐ
def union_parent(parent, a, b):
a = find_parent(parent, a)
b = find_parent(parent, b)
if a < b:
parent[b] = a
else:
parent[a] = b
# ๋
ธ๋์ ๊ฐ์์ ๊ฐ์ (union ์ฐ์ฐ)์ ๊ฐ์ ์
๋ ฅ๋ฐ๊ธฐ
v, e = map(int, input().split())
parent = [0] * (v+1) # ๋ถ๋ชจ ํ
์ด๋ธ ์ด๊ธฐํ
# ๋ถ๋ชจ ํ
์ด๋ธ์์, ๋ถ๋ชจ๋ฅผ ์๊ธฐ ์์ ์ผ๋ก ์ด๊ธฐํ
for i in range(1, v+1):
parent[i] = i
# union ์ฐ์ฐ์ ๊ฐ๊ฐ ์ํ
for i in range(e):
a, b = map(int, input().split())
union_parent(parent, a, b)
# ๊ฐ ์์๊ฐ ์ํ ์งํฉ ์ถ๋ ฅ
print('๊ฐ ์์๊ฐ ์ํ ์งํฉ: ', end='')
for i in range(1, v+1):
print(find_parent(parent, i), end=' ')
print()
# ๋ถ๋ชจ ํ
์ด๋ธ ๋ด์ฉ ์ถ๋ ฅ
print('๋ถ๋ชจ ํ
์ด๋ธ: ', end='')
for i in range(1, v+1):
print(parent[i], end=' ')
• ํฉ์งํฉ(Union) ์ฐ์ฐ์ด ํธํฅ๋๊ฒ ์ด๋ฃจ์ด์ง๋ ๊ฒฝ์ฐ ์ฐพ๊ธฐ(Find) ํจ์๊ฐ ๋นํจ์จ์ ์ผ๋ก ๋์ํฉ๋๋ค.
• ์ต์ ์ ๊ฒฝ์ฐ์๋ ์ฐพ๊ธฐ(Find) ํจ์๊ฐ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ค ํ์ธํ๊ฒ ๋์ด ์๊ฐ ๋ณต์ก๋๊ฐ O(V)์ ๋๋ค.
๊ฒฝ๋ก ์์ถ
• ์ฐพ๊ธฐ(Find) ํจ์๋ฅผ ์ต์ ํํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ฒฝ๋ก ์์ถ(Path Compression)์ ์ด์ฉํ ์ ์์ต๋๋ค.
• ์ฐพ๊ธฐ(Find) ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ ๋ค์ ๋ถ๋ชจ ํ ์ด๋ธ ๊ฐ์ ๋ฐ๋ก ๊ฐฑ์ ํฉ๋๋ค.
# ํน์ ์์๊ฐ ์ํ ์งํฉ์ ์ฐพ๊ธฐ
def find_parent(parent, x):
# ๋ฃจํธ ๋
ธ๋๊ฐ ์๋๋ผ๋ฉด, ๋ฃจํธ ๋
ธ๋๋ฅผ ์ฐพ์ ๋๊น์ง ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
if parent[x] != x:
parent[x] = find_parent(parent, parent[x])
return parent[x]
• ๊ฒฝ๋ก ์์ถ ๊ธฐ๋ฒ์ ์ ์ฉํ๋ฉด ๊ฐ ๋ ธ๋์ ๋ํ์ฌ ์ฐพ๊ธฐ(Find) ํจ์๋ฅผ ํธ์ถํ ์ดํ์ ํด๋น ๋ ธ๋์ ๋ฃจํธ๋ ธ๋๊ฐ ๋ฐ๋ก ๋ถ๋ชจ ๋ ธ๋๊ฐ ๋ฉ๋๋ค.
• ๋์ผํ ์์์ ๋ํด์ ๋ชจ๋ ํฉ์งํฉ(Union) ํจ์๋ฅผ ์ฒ๋ฆฌํ ํ ๊ฐ ์์์ ๋ํ์ฌ ์ฐพ๊ธฐ(Find) ํจ์๋ฅผ ์ํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ถ๋ชจ ํ ์ด๋ธ์ด ๊ฐฑ์ ๋ฉ๋๋ค.
• ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ๋นํ์ฌ ์๊ฐ๋ณต์ก๋๊ฐ ๊ฐ์ ๋ฉ๋๋ค.
1-1. ์๋ก์ ์งํฉ์ ํ์ฉํ ์ฌ์ดํด ํ๋ณ
• ์๋ก์ ์งํฉ์ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ ๋ด์์ ์ฌ์ดํด์ ํ๋ณํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
• ์ฐธ๊ณ ๋ก ๋ฐฉํฅ ๊ทธ๋ํ์์์ ์ฌ์ดํด ์ฌ๋ถ๋ DFS๋ฅผ ์ด์ฉํ์ฌ ํ๋ณํ ์ ์์ต๋๋ค.
• ์ฌ์ดํด ํ๋ณ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ๊ฐ ๊ฐ์ ์ ํ๋์ฉ ํ์ธํ๋ฉฐ ๋ ๋ ธ๋์ ๋ฃจํธ ๋ ธ๋๋ฅผ ํ์ธํฉ๋๋ค.
1) ๋ฃจํธ ๋ ธ๋๊ฐ ์๋ก ๋ค๋ฅด๋ค๋ฉด ๋ ๋ ธ๋์ ๋ํ์ฌ ํฉ์งํฉ(Union) ์ฐ์ฐ์ ์ํํฉ๋๋ค.
2) ๋ฃจํธ ๋ ธ๋๊ฐ ์๋ก ๊ฐ๋ค๋ฉด ์ฌ์ดํด(Cycle)์ด ๋ฐ์ํ ๊ฒ์ ๋๋ค.
2. ๊ทธ๋ํ์ ํฌํจ๋์ด ์๋ ๋ชจ๋ ๊ฐ์ ์ ๋ํ์ฌ 1๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
# ํน์ ์์๊ฐ ์ํ ์งํฉ์ ์ฐพ๊ธฐ
def find_parent(parent, x):
# ๋ฃจํธ ๋
ธ๋๊ฐ ์๋๋ผ๋ฉด, ๋ฃจํธ ๋
ธ๋๋ฅผ ์ฐพ์ ๋๊น์ง ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
if parent[x] != x:
# ๋ฃจํธ ๋
ธ๋๋ฅผ ๊ฒ์ ๊ฐฑ์ ์์ผ์ค๋ค.
parent[x] = find_parent(parent, parent[x])
return parent[x]
# ๋ ์์๊ฐ ์ํ ์งํฉ์ ํฉ์น๊ธฐ
def union_parent(parent, a, b):
a = find_parent(parent, a)
b = find_parent(parent, b)
if a < b:
parent[b] = a
else:
parent[a] = b
# ๋
ธ๋์ ๊ฐ์์ ๊ฐ์ (union ์ฐ์ฐ)์ ๊ฐ์ ์
๋ ฅ๋ฐ๊ธฐ
v, e = map(int, input().split())
parent = [0]*(v+1) # ๋ถ๋ชจํ
์ด๋ธ ์ด๊ธฐํ
# ๋ถ๋ชจ ํ
์ด๋ธ์์์, ๋ถ๋ชจ๋ฅผ ์๊ธฐ ์์ ์ผ๋ก ์ด๊ธฐํ
for i in range(1, v+1):
parent[i] = i
cycle = False # ์ฌ์ดํด ๋ฐ์ ์ฌ๋ถ
for i in range(e):
a, b = map(int, input().split())
# ์ฌ์ดํด์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์ข
๋ฃ
if find_parent(parent, a) == find_parent(parent, b):
cycle = True
break
# ์ฌ์ดํด์ด ๋ฐ์ํ์ง ์์๋ค๋ฉด ํฉ์งํฉ(union) ์ํ
else:
union_parent(parent, a, b)
if cycle:
print("์ฌ์ดํด์ด ๋ฐ์ํ์ต๋๋ค.")
else:
print("์ฌ์ดํด์ด ๋ฐ์ํ์ง ์์์ต๋๋ค.")
• ์ ์ฅํธ๋ฆฌ : ๊ทธ๋ํ์์ ๋ชจ๋ ๋ ธ๋๋ฅผ ํฌํจํ๋ฉด์ ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋ ๋ถ๋ถ ๊ทธ๋ํ๋ฅผ ์๋ฏธํฉ๋๋ค.
• ๋ชจ๋ ๋ ธ๋๊ฐ ํฌํจ๋์ด ์๋ก ์ฐ๊ฒฐ๋๋ฉด์ ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋๋ค๋ ์กฐ๊ฑด์ ํธ๋ฆฌ์ ์กฐ๊ฑด์ด๊ธฐ๋ ํฉ๋๋ค.
์ต์์ ์ฅ ํธ๋ฆฌ
• ์ต์ํ์ ๋น์ฉ์ผ๋ก ๊ตฌ์ฑ๋๋ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ฐพ์์ผ ํ ๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
• ์๋ฅผ ๋ค์ด N๊ฐ์ ๋์๊ฐ ์กด์ฌํ๋ ์ํฉ์์ ๋ ๋์ ์ฌ์ด์ ๋๋ก๋ฅผ ๋์ ์ ์ฒด ๋์๊ฐ ์๋ก ์ฐ๊ฒฐ๋ ์ ์๊ฒ ๋๋ก๋ฅผ ์ค์นํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ด ์๋ค.
• ๋ ๋์ A, B๋ฅผ ์ ํํ์ ๋ A์์ B๋ก ์ด๋ํ๋ ๊ฒฝ๋ก๊ฐ ๋ฐ๋์ ์กด์ฌํ๋๋ก ๋๋ก๋ฅผ ์ค์นํฉ๋๋ค.
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
• ๋ํ์ ์ธ ์ต์ ์ ์ฅ ํธ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
• ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅ๋ฉ๋๋ค.
• ๊ตฌ์ฒด์ ์ธ ๋์๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋น์ฉ์ ๋ฐ๋ผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํฉ๋๋ค.
2. ๊ฐ์ ์ ํ๋์ฉ ํ์ธํ๋ฉฐ ํ์ฌ์ ๊ฐ์ ์ด ์ฌ์ดํด์ ๋ฐ์์ํค๋์ง ํ์ธํฉ๋๋ค.
1) ์ฌ์ดํด์ด ๋ฐ์ํ์ง ์๋ ๊ฒฝ์ฐ ์ต์ ์ ์ฅํธ๋ฆฌ์ ํฌํจ์ํต๋๋ค.
2) ์ฌ์ดํด์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์ต์ ์ ์ฅํธ๋ฆฌ์ ํฌํจ์ํค์ง ์์ต๋๋ค.
3. ๋ชจ๋ ๊ฐ์ ์ ๋ํ์ฌ 2๋ฒ์ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
# ํน์ ์์๊ฐ ์ํ ์งํฉ์ ์ฐพ๊ธฐ
def find_parent(parent, x):
# ๋ฃจํธ ๋
ธ๋๊ฐ ์๋๋ผ๋ฉด, ๋ฃจํธ ๋
ธ๋๋ฅผ ์ฐพ์ ๋๊น์ง ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
if parent[x] != x:
parent[x] = find_parent(parent, parent[x])
return parent[x]
# ๋ ์์๊ฐ ์ํ ์งํฉ์ ํฉ์น๊ธฐ
def union_parent(parent, a, b):
a = find_parent(parent, a)
b = find_parent(parent, b)
if a < b:
parent[b] = a
else:
parent[a] = b
# ๋
ธ๋์ ๊ฐ์์ ๊ฐ์ (union ์ฐ์ฐ)์ ๊ฐ์ ์
๋ ฅ๋ฐ๊ธฐ
v, e = map(int, input().split())
parent = [0] * (v+1) # ๋ถ๋ชจ ํ
์ด๋ธ ์ด๊ธฐํ
# ๋ชจ๋ ๊ฐ์ ์ ๋ด์ ๋ฆฌ์คํธ์ ์ต์ข
๋น์ฉ์ ๋ด์ ๋ณ์
edges = []
result = 0
# ๋ถ๋ชจ ํ
์ด๋ธ ์์์, ๋ถ๋ชจ๋ฅผ ์๊ธฐ ์์ ์ผ๋ก ์ด๊ธฐํ
for i in range(1, v+1):
parent[i] = i
# ๋ชจ๋ ๊ฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
for _ in range(e):
a, b, cost = map(int, input().split())
# ๋น์ฉ์์ผ๋ก ์ ๋ ฌํ๊ธฐ ์ํด์ ํํ์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๋น์ฉ์ผ๋ก ์ค์
edges.append((cost, a, b))
# ๊ฐ์ ์ ๋น์ฉ์์ผ๋ก ์ ๋ ฌ
edges.sort()
# ๊ฐ์ ์ ํ๋์ฉ ํ์ธํ๋ฉฐ
for edges in edges:
cost, a, b = edges
# ์ฌ์ดํด์ด ๋ฐ์ํ์ง ์๋ ๊ฒฝ์ฐ์๋ง ์งํฉ์ ํฌํจ
if find_parent(parent, a) != find_parent(parent, b):
union_parent(parent, a, b)
result += cost
print(result)
• ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ ์ ๊ฐ์๊ฐ E๊ฐ์ผ ๋, O(ElogE)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
• ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์์ ๊ฐ์ฅ ๋ง์ ์๊ฐ์ ์๊ตฌํ๋ ๊ณณ์ ๊ฐ์ ์ ์ ๋ ฌ์ ์ํํ๋ ๋ถ๋ถ์ ๋๋ค.
• ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด E๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๊ธฐ ์ํ ์๊ฐ ๋ณต์ก๋๋ O(ElogE) ์ ๋๋ค.
๊ฐ์ ๋ฐ ์ถ์ฒ
'๐ตCoding Test > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค Level 2 (0) | 2022.06.19 |
---|---|
[ ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ ] Greedy ๊ธฐ์ถ๋ฌธ์ (0) | 2022.06.16 |
[ ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ ] ์ต๋จ ๊ฒฝ๋ก (0) | 2022.05.02 |
[ ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ ] ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (0) | 2022.04.29 |
[ ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ ] ์ด์ง ํ์ (0) | 2022.03.23 |