๋ฌธ์
https://www.acmicpc.net/problem/9466
๋ฐฑ์ค ๋ฌธ์ ์ง - BOJ ๊ธธ๋ผ์ก์ด ๋ฒ ํ (1)
์๊ณ ๋ฆฌ์ฆ: DFS
ํ์ด
์ฃผ์ด์ง ์ ํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์ด๋ ํ๋ก์ ํธ ํ์๋ ์ํ์ง ์๋ ํ์๋ค์ ์๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ.
์ฒ์์ ์ ๋์จ ํ์ธ๋๋ฅผ ์ฌ์ฉํด์ผํ๋? ์ถ์๊ณ ๊ตฌ์ํด๋ดค์ผ๋ ์คํจ...
์๊ณ ๋ณด๋ DFS(๊น์ด์ฐ์ ํ์) ๋ฌธ์ ์๋ค.
1๋ฒ์ด 2๋ฒ์ ์ ํํ๊ณ , 2๋ฒ์ด 3๋ฒ์ ์ ํํ๊ณ , 3๋ฒ์ด 1๋ฒ์ ์ ํํ๋ฉด ์ด ์
์ ํ ํ์ด๋ค.
๋ฐ๋ผ์ ์ด ๋ฌธ์ ๋ ๊ทธ๋ํ์์ ์ฌ์ดํด์ ๊ฐฏ์๋ฅผ ์ฐพ๋๊ฒ๊ณผ ๋์ผํ๋ค.
๊ฐ ๋ฒํธ์ ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ์ ์ฅํ visited๋ฅผ ์์ฑํด์ฃผ๊ณ (ํธ์์ n+1๊ฐ๋ก)
ํ๋์ฉ ์ํํ๋ฉฐ ๋ฐฉ๋ฌธํ์ง ์์ ์๋ฒ์ผ๊ฒฝ์ฐ DFS๋ฅผ ์คํํ๋ค.
DFS๋ฅผ ํตํด 'ํ์ ๊ฐ์ง ์ฌ๋๋ค'์ ์๋ฅผ ๊ตฌํ๋๊ฒ์ด๋ค.
DFS๋ ์คํ๋ ๋๋ง๋ค ๋น ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋๋ฐ, ์ฌ๊ธฐ์ ํ์ฌ ์๋ฒ๋ถํฐ ์์ผ๋ก ์ ํ๋ ์๋ฒ๋ค์ ์ ์ฅํด์ค๋ค.
(ํ์ฌ ์๋ฒ์ A1, ๋ค์ ์๋ฒ์ An์ด๋ผ ํ๋ค๋ฉด A1 -> A2 -> A3 ...)
๋ง์ฝ, ๋ค์ ์๋ฒ์ด ์ด๋ฏธ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ ์ํ๊ณ ๋ฆฌ์คํธ์ ์กด์ฌํ๋ค๋ฉด ์ฌ์ดํด(ํ)์ด๋ผ๋ ์๋ฆฌ์ด๋ฏ๋ก,๋ฆฌ์คํธ์ ๊ธธ์ด - ์ด๋ฏธ ๋ค์ด์๋ ์๋ฒ์ ์ธ๋ฑ์ค๊ฐ์ ๋ฐํํ๋ค.
ํ์ง๋ง ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ง ๋์ด์๊ณ ๋ฆฌ์คํธ์๋ ์๋ ์ํ๋ผ๋ฉด ์์ ํ ๋ฐ๋ก๊ตญ๋ฐฅ์ธ ์ํ์ด๋ 0์ ๋ฐํํด์ค๋ค.
๊ทธ ์ธ ๋ฐฉ๋ฌธํ์ง ์์ ์๋ฒ์ ํํด์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ, ๋ฆฌ์คํธ ์ถ๊ฐ, ๋ค์ ์๋ฒ ์ง์ ์ ์คํํ๋ค.
๋ชจ๋ ์๋ฒ์ด ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋๋ฉด ์ ์ฒด ์ธ์ ์ - ํ์ ๊ฐ์ง ์ฌ๋๋ค์ ๊ฐ์ ์ถ๋ ฅํ๋ค.
์ ์ฒด์ฝ๋
# ๋ฉ๋ชจ๋ฆฌ: 48104KB / ์๊ฐ: 2116ms
from sys import stdin
input = stdin.readline
def dfs(start):
global teams
team = [start]
visited[start] = True
nxt = lst[start]
while True:
if visited[nxt]:
if nxt in team: # ๋ฐฉ๋ฌธํ ์ํ์ด๊ณ team์ ์กด์ฌํ๋ค๋ฉด,
return len(team) - team.index(nxt) # team ๊ธธ์ด - nxt์ ์ฒซ๋ฒ์งธ ์์น ๋ฐํ
else:
return 0
else:
visited[nxt] = True
team.append(nxt)
nxt = lst[nxt]
for _ in range(int(input())):
n = int(input())
lst = [0] + list(map(int, input().split()))
visited = [False] * (n+1)
teams = 0
for i in range(1, n+1):
if not visited[i]:
teams += dfs(i)
print(n - teams)
๋ค๋ฅธ ํ์ด๋ค์ ์ฐพ์๋ณด๋ ๋ค๋ค ์ฌ๊ท๋ก ํธ๋ ๋ฏํ๋ค...
์๋๋ ์ฌ๊ท๋ฅผ ์ฌ์ฉํ ํ์ด์ธ๋ฐ ๊ฐ๋
์ฑ ์ธก๋ฉด์์ ์ด๊ฒ ๋ ๋์๊ฒ๊ฐ๋ค.
# ์ถ์ฒ๐ https://velog.io/@keynene/Python%ED%8C%8C%EC%9D%B4%EC%8D%AC3-%EB%B0%B1%EC%A4%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-9466-%ED%85%80-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8
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))