๐ก ์กฐ๊ฑด
- 1๋ถํฐ N๊น์ง ์ ์ N๊ฐ๋ก ์ด๋ฃจ์ด์ง ์์ด์ ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๋ค.
- ์์ด ๊ทธ๋ํ (3, 2, 7, 8, 1, 4, 5, 6) ์๋ ์ด 3๊ฐ์ ์ฌ์ดํด์ด ์๋ค. ์ด๋ฌํ ์ฌ์ดํด์ "์์ด ์ฌ์ดํด" ์ด๋ผ๊ณ ํ๋ค.
- N๊ฐ์ ์ ์๋ก ์ด๋ฃจ์ด์ง ์์ด์ด ์ฃผ์ด์ก์ ๋, ์์ด ์ฌ์ดํด์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
- ์ฒซ์งธ ์ค์ ํ
์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค.
๊ฐ ํ
์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ ์์ด์ ํฌ๊ธฐ N (2 โค N โค 1,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์๋ ์์ด์ด ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ์ ์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์๋ค.
- ๊ฐ ํ
์คํธ ์ผ์ด์ค๋ง๋ค, ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์์ด์ ์กด์ฌํ๋ ์์ด ์ฌ์ดํด์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
- BFS, ๊ทธ๋ํํ์ ์ ํ์ ๋ฌธ์
๐ฅ ์์ค ์ฝ๋
from collections import deque
from sys import stdin, setrecursionlimit
setrecursionlimit(10 ** 6)
def get_cnt(x, graph, visited):
q = deque()
q.append(x)
visited.add(x)
while q:
now = q.popleft()
for y in list(graph[now]):
if y not in visited:
q.append(y)
visited.add(y)
return 1
def solve(temp):
global ans
res = 0
graph = [[] for _ in range(n + 1)]
for i in range(n):
graph[temp[i]].append(arr[i])
visited = set()
for i in range(1, n + 1):
if i not in visited:
res += get_cnt(i, graph, visited)
ans = max(res, ans)
for _ in range(int(stdin.readline())):
n = int(stdin.readline())
arr = list(map(int, stdin.readline().split()))
ans = 0
solve([x for x in range(1, n + 1)])
print(ans)
๐ ์์ ๋ฐ ์คํ๊ฒฐ๊ณผ
์์
2
8
3 2 7 8 1 4 5 6
10
2 1 3 4 5 6 7 9 10 8
์คํ๊ฒฐ๊ณผ
3
7
โจ๏ธ ๋ฌธ์ ํ์ด
- ํ
์คํธ ์ผ์ด์ค ์๋งํผ ์
๋ ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์ ์ ์ ์๋ ๋ฐฉ๋ฒ์ฒ ๋จธ ๊ทธ๋ํ๋ก ๋ง๋ค์ด์ ์ฌ์ดํด์ ์ธ์ด์ฃผ๋ ๋ฌธ์ ์ด๋ค.
- ๊ทธ๋ํ๋ฅผ ์ํํ๋ฉด์ visited ๋ณ์๋ฅผ set()์ผ๋ก ๋ง๋ค์ด ์ฃผ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.
- ์ฌ์ดํด์ ์ธ์ด์ค ๋ค, ๊ฐ์๋ฅผ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค.