Algorithm/DFS&BFS

9466번/DFS ν…€ ν”„λ‘œμ νŠΈ/파이썬

μ •ν˜Έλ‚˜ 2024. 9. 29. 15:17

πŸ“• 문제

https://www.acmicpc.net/problem/9466

 

πŸ“—μ‹€ν–‰κ²°κ³Ό

 

 

πŸ“„ λ‚΄κ°€ μƒκ°ν•œ 풀이

 

 

사이클이 λ§Œλ“€μ–΄μ§€λŠ” 학생이 νŒ€μ΄ λ§Œλ“€μ–΄μ§.

 

 

πŸ’» λ‹΅μ•ˆ

import sys
sys.setrecursionlimit(10 ** 6)
input = sys.stdin.readline


def dfs(x,result):
    visited[x] = True
    # 사이클을 μ΄λ£¨λŠ” νŒ€ ν™•μΈν•˜κΈ° μœ„ν•΄
    cycle.append(x)
    number = arr[x]

    # λ°©λ¬Έκ°€λŠ₯ν•œ 곳이 λλ‚¬λŠ”μ§€
    if visited[number]:
        # 사이클 κ°€λŠ₯ μ—¬λΆ€
        if number in cycle:
            # 사이클 λ˜λŠ” ꡬ간 λΆ€ν„°λ§Œ νŒ€ 이룸
            result += cycle[cycle.index(number):]
        return
    else:
        dfs(number,result)



# ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€μΈ int(input())만큼 μˆ˜ν–‰ 
for _ in range(int(input())):
    # n : 학생 수
    n = int(input())
    # ν•™μƒλ“€μ˜ 번호
    arr = [0] +list(map(int,input().split()))
    visited = [False for _ in range(n+1)]
    result =[]
    
    for i in range(1,n+1):
        # λ°©λ¬Έ μ•ˆν•œ 곳이면
        if not visited[i]:
            # cycleν–‰λ ¬ μƒμ„±ν•΄μ„œ
            cycle = []
            # dfsν•¨μˆ˜ 돌림
            dfs(i,result)

    # νŒ€μ— μ—†λŠ” μ‚¬λžŒμˆ˜
    print(n-len(result))

 

☺️ λŠλ‚€μ 

DFS/BFS 어렀움

참고자료 봐야 κ΅¬ν˜„κ°€λŠ₯

 

 

πŸ˜‰ μ°Έκ³ 

https://oh2279.tistory.com/138

 

[λ°±μ€€/파이썬] 9466번 ν…€ ν”„λ‘œμ νŠΈ

https://www.acmicpc.net/problem/9466 9466번: ν…€ ν”„λ‘œμ νŠΈ 이번 가을학기에 '문제 ν•΄κ²°' κ°•μ˜λ₯Ό μ‹ μ²­ν•œ 학생듀은 ν…€ ν”„λ‘œμ νŠΈλ₯Ό μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€. ν”„λ‘œμ νŠΈ νŒ€μ› μˆ˜μ—λŠ” μ œν•œμ΄ μ—†λ‹€. 심지어 λͺ¨λ“  학생듀이

oh2279.tistory.com

 

 

https://www.youtube.com/watch?v=yPuow6aACvE