기록

백준_9466_텀 프로젝트 본문

코딩테스트/python

백준_9466_텀 프로젝트

youngyin 2022. 10. 5. 00:57

문제

 

9466번: 텀 프로젝트

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

www.acmicpc.net

풀이

1) 사이클 찾기

모든 학생들을 시작점으로 두고 dfs를 통해 사이클을 탐색한다. 

1. 기존에 방문하지 않은 학생이라면,

  • 방문기록을 남긴다.
  • 다음 학생으로 이동한다.

2. 기존에 방문한 학생이라면, 방문 경로를 찾아 사이클을 이루는 학생의 수를 반환한다.

2) 시간초과

시간초과로 오래 고민했던 문제인데, 다른 문제를 풀면서 다시 한번 도전했다. 

코드

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

def dfs(n) :
    if n == END :
        cnt = 0
        n = visited.pop()
        for pre in visited[::-1] :
            cnt += 1
            if pre == n : return cnt
        return False

    nxt, student[n] = student[n], END  # visited
    visited.append(n)
    return dfs(nxt)

END = 0
visited = list()

for t in range(int(input().strip())) :
    N = int(input().strip())
    student = list(map(int, input().strip().split()))
    student = [END] + student
    cnt = 0

    for i in range(N) :
        visited.clear()
        cnt += dfs(i+1)

    print(len(student) - cnt - 1)

마무리

사이클을 찾는 문제로, 아래의 문제와 유사한 풀이를 사용했다. 

2022.10.04 - [코딩테스트/백준] - 백준_16724_피리 부는 사나이

'코딩테스트 > python' 카테고리의 다른 글

백준_1509_팰린드롬 분할  (0) 2022.10.10
백준_1647_도시 분할 계획  (0) 2022.10.06
백준_16724_피리 부는 사나이  (0) 2022.10.04
백준_16946_벽 부수고 이동하기4  (0) 2022.10.03
백준_14391_종이조각  (0) 2022.05.10
Comments