https://www.acmicpc.net/problem/9466
μκ°μ ν 3μ΄λ‘ λ§€μ° κΈΈμ§λ§ λ무 볡μ‘νμ§ μμ λ¬Έμ .
μλ§ ν μ€νΈ μΌμ΄μ€κ° μ¬λ¬ κ°λΌμ μκ°μ νμ λλνκ² λ κ±° κ°λ€.
μμ΄λμ΄
1. κ·Έλν
- μΌλ¨ 보μλ§μ κ·Έλνλ₯Ό μ¨μΌ νλ€κ³ μκ°νλ€.
- λ¬Έμ 쑰건μμ νμ΄ λλ €λ©΄ μλ‘κ° κΌ¬λ¦¬λ₯Ό λ¬Όλ― μ¬μ΄ν΄μ΄ μκ²¨μΌ νλ€.
- κ·ΈλΌ μ΄ λ¬Έμ λ κ·Έλνμμ 'μ¬μ΄ν΄μ μ΄λ»κ² μ°Ύκ³ νλ³νλ'μ λν΄μ μκ°νλ©΄ λλ€.
2. dfs
- λ°©λ¬Έ μ 무λ₯Ό ν΅ν΄ μ¬μ΄ν΄μ΄ μκ²Όλμ§ μ μκ²Όλμ§ μ°ΎκΈ°λ‘ κ²°μ
- λ¬Έμ μμ μ μλ κ±Έλ‘ μ€λͺ νλ©΄ ν¨μ(dfs)μμ 4 -> 7 -> 6 λ°©λ¬Έ ν λ€μ 4λ‘ λ°©λ¬Ένλ€.
- μ΄λ dfs(4)μμ μ΄λ―Έ 4κ° λ°©λ¬ΈλμμΌλ©΄ μ¬μ΄ν΄μ΄λΌκ³ νλ¨νκ³ νμ μλ₯Ό κ³μ°ν΄μ€λ€.
μ 체 μ½λ
import sys
sys.setrecursionlimit(10**6)
def dfs(n):
global count
visited[n] = True
cycle_list.append(n)
if visited[arr[n]] == True:
if arr[n] in cycle_list:
count -= len(cycle_list[cycle_list.index(arr[n]):])
return
else:
dfs(arr[n])
T = int(input())
for _ in range(T):
N = int(input())
arr = [0]
arr.extend([int(x) for x in sys.stdin.readline().rstrip().split()])
visited = [False] * (N + 1)
count = N
for i in range(1, N + 1):
if not visited[i]:
cycle_list = []
dfs(i)
print(count)
μ½λ μ€λͺ
T = int(input())
for _ in range(T):
N = int(input())
arr = [0]
arr.extend([int(x) for x in sys.stdin.readline().rstrip().split()])
visited = [False] * (N + 1)
count = N
for i in range(1, N + 1):
if not visited[i]:
cycle_list = []
dfs(i)
print(count)
μ λ ₯νλ λΆλΆμ κ°λ¨νλ€.
arr리μ€νΈμμ μΈλ±μ€λ μ ννλ νμ κ·Έλ¦¬κ³ κ°μ μ νλλ νμμΌλ‘ μ μ₯νλ€.
dfsλ 1λΆν° NκΉμ§ μ λΆ μ€ννκ³ , μ΄λ―Έ λ°©λ¬Έλ(visited) λ Έλλ λκΈ΄λ€.
μλ, μ΄λ―Έ μ°Ύμ μ¬μ΄ν΄μ μ€λ³΅ν΄μ λ μ°Ύμ μ μκΈ° λλ¬Έ.
def dfs(n):
global count
visited[n] = True
cycle_list.append(n)
if visited[arr[n]] == True:
if arr[n] in cycle_list:
count -= len(cycle_list[cycle_list.index(arr[n]):])
return
else:
dfs(arr[n])
λ¨Όμ dfsν¨μλ₯Ό μ€ννλ©΄ λ°©λ¬Έ νμλ₯Ό νκ³ μμλ‘ λ§λ μ¬μ΄ν΄ 리μ€νΈμ λ Έλλ₯Ό μΆκ°ν΄μ€λ€.
κ·Έλ¦¬κ³ λ΄κ° λ°©λ¬Έν λ€μ λ Έλ(arr[n])κ° ν λ²λ λ°©λ¬Έμ μ νμΌλ©΄ dfs(arr[n]) μ€νν΄μ€λ€.
λ°λλ‘ arr[n]κ° μ΄λ―Έ λ°©λ¬Έν μνλΌλ©΄ arr[n]μ΄ μ¬μ΄ν΄ 리μ€νΈμ μλμ§ νμΈνλ€.
μ¬μ΄ν΄ 리μ€νΈμ μλ€λ©΄ μ 체 νμμμμ μ¬μ΄ν΄ ν¬κΈ°λ§νΌ λΉΌμ£Όλ©΄ λλ€.
μ¬μ΄ν΄ 리μ€νΈλ₯Ό μ¬λΌμ΄μ±νλ μ΄μ λ λ€μκ³Ό κ°λ€.
μλ₯Ό λ€μ΄ μμ κ°μ κ·Έλνκ° μλ€κ³ νμ λ,
dfs(2)λ₯Ό μ€ννλ©΄ μ¬μ΄ν΄ 리μ€νΈμ [2, 4, 7, 6] μ΄λ κ² μ μ₯λ κ²μ΄λ€.
μ¬κΈ°μ μ¬μ΄ν΄μ 4 7 6 μ΄λ―λ‘ μ¬μ΄ν΄μ΄ μμν 4μμλΆν° 리μ€νΈλ₯Ό μλΌμ£Όλ©΄ λλ€.
'𧩠Problem Solving > [λ°±μ€]' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λ°±μ€] 1647 λμ λΆν κ³ν (python νμ΄μ¬) (0) | 2022.08.01 |
---|---|
[λ°±μ€] 1644 μμμ μ°μν© (python νμ΄μ¬) (0) | 2022.07.31 |
[λ°±μ€] 1806 λΆλΆν© (python νμ΄μ¬) (0) | 2022.07.29 |
[λ°±μ€] 1504 νΉμ ν μ΅λ¨ κ²½λ‘ (python νμ΄μ¬) (0) | 2022.07.28 |
[λ°±μ€] 12100 2048(easy) (python νμ΄μ¬) (0) | 2022.07.25 |