728x90
https://www.acmicpc.net/problem/9466
9466번: 텀 프로젝트
이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이 동일한 팀의 팀원인 경우와 같이 한 팀만 있을
www.acmicpc.net
순열 사이클 문제로 접근하여 문제를 해결하였습니다. 깊이우선 탐색으로 한 학생으로부터 선택한 팀원을 깊이우선 깊이 우선 탐색하면서 마지막 학생이 시작한 한 학생을 가르킨다면 사이클이 생기고 이 사이클이 생긴 리스트들을 결과 값에 저장합니다. 또한 자기자신이 자기자신을 뽑은경우는 자기혼자 팀원이 될 수 있습니다.
cycle[cycle.index(newstudent) 자기자신의 Index로 부터 개수를 새면 됩니다.
import sys
sys.setrecursionlimit(100001)
T = int(input())
def dfs(student):
global result
visited[student] = True
cycle.append(student)
newstudent = graph[student]
if visited[newstudent]:
if newstudent in cycle:
result += cycle[cycle.index(newstudent):] # 자기자신으로부터 마지막팀원까지 그룹핑
return
else:
dfs(newstudent)
for _ in range(T):
n = int(input())
graph = [0] + list(map(int, input().split()))
result = []
visited = [False for _ in range(n+1)]
for i in range(1, n+1):
if not visited[i]:
cycle = []
dfs(i)
print(n - len(result))
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1976번 : 여행 가자 (0) | 2023.08.21 |
---|---|
[백준] 1717번 : 집합의 표현 (0) | 2023.08.21 |
[백준] 9019번 : DSLR (0) | 2023.08.18 |
[백준] 15683번 : 감시 (0) | 2023.08.18 |
[백준] 1038번 : 감소하는 수 (0) | 2023.08.17 |