Problem Solving/백준

[BOJ 백준] 9466번 : 텀 프로젝트 - 파이썬, Python

돌돌김 2021. 1. 6. 22:53

www.acmicpc.net/problem/9466

 

9466번: 텀 프로젝트

이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이 동일한 팀의 팀원인 경우와 같이 한 팀만 있을

www.acmicpc.net

 

DFS를 활용해 사이클 여부를 판단하는 문제이다.

 

사이클 여부를 판단하는데 익숙하지 않아서 다른 사람들의 코드를 보고 풀었다. 

 

꼭 복습해야한다,

 

 

 

소스코드

 

import sys
sys.setrecursionlimit(111111) # 재귀 깊이 설정

sys.stdin = open("input.txt", "r")

def dfs(cur):   
    global cnt, visited, done
    visited[cur] = True
    nextNode = student_mate[cur]
    if not visited[nextNode]: # 다음 노드를 방문하지 않았다면 방문
        dfs(nextNode)
    else: 
        if not done[nextNode]: # 사이클이 형성되었다.
            i = nextNode
            while i != cur: # 팀원들을 모두 센다
                cnt += 1 
                i = student_mate[i]
            cnt+=1 # 자기 자신을 센다
    done[cur] = True 

for _ in range(int(input())): # 테스트 케이스 반복하며 실행
    n = int(input())    
    student_mate = list(map(lambda x : int(x)-1, input().split()))
    visited = [False]*n  # 방문 체크 배열
    done = [False]*n  # 팀 매칭 여부(사이클 존재 여부)
    cnt = 0
    for i in range(n):
        if not visited[i]:
            dfs(i)   
    print(n-cnt)