์์์ ํ ๋
ธ๋์์ ์์ํด์ ๋ค์ ๋ถ๊ธฐ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ํด๋น ๋ถ๊ธฐ๋ฅผ ์๋ฒฝํ๊ฒ ํ์ํ๋ ๋ฐฉ๋ฒ
#์ฌ๊ท #์ํ #๋ฌดํ๋ฃจํํ์ถ #Back-Tracking
๋ด ํฌ์คํ
: [Python/ํ์ด์ฌ][๐ฅ1] ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ 14888 - ์ฐ์ฐ์ ๋ผ์๋ฃ๊ธฐ
์ด์ ํฌ์คํ
๊ณผ ๋น์ทํ DFS์๊ณ ๋ฆฌ์ฆ + ์์ด ๋ฌธ์ ์ด๋ค.
์ฐ์ ํ
์คํธ์ผ์ด์ค๋งํผ ์คํ๋๋ฏ๋ก ํ๋์ ์ผ์ด์ค์ ๋์์ T๋งํผ ๋ฐ๋ณตํ๋for loof
์์์ ๊ตฌํํ์
n, number(์ ํ๋ํ์ ๋ฆฌ์คํธ)๋ฅผ ์
๋ ฅ๋ฐ๊ณ , visited(list)์ result(list)๋ฅผ ์
๋ ฅ๋ฐ์
i๊ฐ 1~n๊น์ง ๋ฐ๋ณตํ๋ for loof
์์ visited[i] == False
์ด๋ฉด dfs(v)
๋ฅผ ์คํํ์
dfs(v)
๋ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํจ๊ณผ ๋์์ cycle์ ์ด๋ฃจ๋ ํ์๋ค์ ๋ฐํํด์ฃผ๋ ํจ์๋ก ๊ตฌํํ์
dfs(i)
๋ก ํธ์ถํ์ฌ cycle์ด ๋๋ ํ์๋ฆฌ์คํธ๋ฅผ result์ ์ถ๊ฐํ์import sys
sys.setrecursionlimit(100000)
input = sys.stdin.readline
#cycle ์ด๋ฃจ๋ result ๋ฐํ
def dfs(v):
global result
visited[v] = True
cycle.append(v)
num = number[v]
if visited[num]:
if num in cycle:
result += cycle[cycle.index(num):]
return
else:
dfs(num)
#ํ
์คํธ ์ผ์ด์ค๋งํผ ์คํ
for _ in range(int(input().rstrip())):
N = int(input().rstrip())
number = [0] + list(map(int, input().split()))
visited = [True] + [False]*N
result = []
#1~n๊น์ง ๋ฐฉ๋ฌธ์ฌ๋ถ ํ์ธํ๋ฉด์ dfs()ํธ์ถ
for i in range(1,N+1):
if not visited[i]:
cycle = []
dfs(i)
print(N-len(result))
import sys
sys.setrecursionlimit(100000)
input = sys.stdin.readline
#cycle ์ด๋ฃจ๋ result ๋ฐํ
def dfs(v):
global result #global์ด๋ฏ๋ก result dfs()๋ฐ์ผ๋ก ๋ฐํ ๊ฐ๋ฅ
visited[v] = True #๋ฐฉ๋ฌธ์ฒดํฌ
cycle.append(v) #cycle์ v์ถ๊ฐ
num = number[v] #num = v๊ฐ ์ ํํ ํ์
if visited[num]: #์ ํ๋ ํ์๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ์ ์ด ์์ผ๋ฉด
if num in cycle: #dfs()์์ ๋ง๋ ์์cycle์ num์ด ์๋์ง ํ์ธ
result += cycle[cycle.index(num):] #result์ ์์cycle์ถ๊ฐ
return
else:
dfs(num) #์ ํ๋ ํ์๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ์ ์ ์์ผ๋ฉด dfs(์ ํ๋ํ์)์คํ
#ํ
์คํธ ์ผ์ด์ค๋งํผ ์คํ
for _ in range(int(input().rstrip())):
N = int(input().rstrip())
number = [0] + list(map(int, input().split()))
visited = [True] + [False]*N
result = []
#1~n๊น์ง ๋ฐฉ๋ฌธ์ฌ๋ถ ํ์ธํ๋ฉด์ dfs()ํธ์ถ
for i in range(1,N+1):
if not visited[i]:
cycle = [] #cycle ์ด๊ธฐํ (๋งค ๋ฒํธ๋ง๋ค ํ์ด ๋๋ ํ์์ด ๋ค๋ฅด๋๊น)
dfs(i)
print(N-len(result)) #ํ์ด ์๊พธ๋ ค์ง ํ์ ์ ์ถ๋ ฅ
import sys
sys.setrecursionlimit(100000)
input = sys.stdin.readline
def dfs(v):
global result
visited[v] = True
cycle.append(v)
num = number[v]
if visited[num]:
if num in cycle:
result += cycle[cycle.index(num):]
return
else:
dfs(num)
for _ in range(int(input().rstrip())):
N = int(input().rstrip())
number = [0] + list(map(int, input().split()))
visited = [True] + [False]*N
result = []
for i in range(1,N+1):
if not visited[i]:
cycle = []
dfs(i)
print(N-len(result))
์ ์ฝ๋๋ฅผ ์ฐจ๋ก๋๋ก ํ์ด๋ณด์
ex)
n = 7
number = 3 1 3 7 3 4 6
for loof๋ถํฐ ์ดํด๋ณด๋ฉด,
i = 1
visited[1] = False์ด๋ฏ๋ก dfs(i)ํธ์ถ
๐๐ป dfs(1)
visited[1] = True
cycle.append(1) #์์ cycle = [1]
num = number[1] #num = 3
if visited[3]: #๋ฐฉ๋ฌธ์ํ์ผ๋ฏ๋ก X
else dfs(3)
๐๐ป dfs(3)
visited[3] = True
cycle.append(3) #์์ cycle = [1,3]
num = number[3] #num = 3
if visited[3]: #๋ฐฉ๋ฌธํ์ผ๋ฏ๋ก O
if 3 in cycle: #cycle์ 3 ์์ผ๋ฏ๋ก O
result = cycle[cycle.index(3):] #ํ์ฌ ์ธ๋ฑ์ค๋ถํฐ ๋๊น์ง result์ ์ ์ฅ
return
โcycle[cycle.index(3):]
๋ง result์ ์ ์ฅํ๋ ์ด์
cycle์ [1,3]์ด ์๋๋ฐ,
1์ number[1] = 3 / 3์ number[3] = 3 ์ด๋ฏ๋ก
3๋ง ํ์ ๊พธ๋ฆด ์ ์๊ณ , 1์ ๊ทธ ๋๊ฐ ์ํด๋ ์ ๋๋ก ํ์ ๊พธ๋ฆฌ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด๋ค.
list.index(x)
: list์์์ x์ ์ธ๋ฑ์ค(์์)๋ฅผ ๋ฐํํ๋ค.