ebson

boj.kr/9466 팀 프로젝트 (gold3) 파이썬 풀이 본문

ALGORITHM STUDY WITH PYTHON/BFS | DFS

boj.kr/9466 팀 프로젝트 (gold3) 파이썬 풀이

ebson 2023. 5. 3. 17:00

1. 인덱스 번호를 노드번호, 요소 값을 선택한 노드번호로 갖도록 choose 리스트를 N+1 길이로 초기화

2. chk 리스트를 N+1 개의 0으로 초기화

3. team 리스트를 생성

4. 1번부터 N번 노드까지 순회하면서 아래를 반복

4.1. chk[번호] 값이 0인지 검사

4.2. chk[번호] 값이 0이면, cycle 리스트를 초기화하고 dfs(번호)를 호출

4.2.1. dfs(번호)를 다음과 같이 실행

4.2.1.1. global team 변수를 선언, chk[번호]를 1 증감, cycle에 번호를 append, nxt에 choos(번호)를 저장

4.2.1.2. chk[nxt]가 1이면, cycle에 nxt가 있는지 검사하고 있으면 cycle에서 nxt가 처음 발견되는 index부터 마지막까지 슬라이스하여 team에 추가

4.2.1.3. chk[nxt]가 1이 아니면, dfs(nxt)를 호출

5. N에서 team의 길이를 차감한 값을 출력

 

import sys
sys.setrecursionlimit(10**9)
def dfs(cur):
    global team
    chk[cur] += 1
    cycle.append(cur)
    nxt = choose[cur]
    if chk[nxt] == 1:
        if nxt in cycle:
            team += cycle[cycle.index(nxt):]
    else:
        dfs(nxt)

T = int(input())
for _ in range(T):
    N = int(input())
    choose = [0] + list(map(int, input().split()))
    chk = [0] * (N+1)
    team = []
    for node in range(1, N+1):
        if chk[node] == 0:
            cycle = []
            dfs(node)
    print(N-len(team))

 

체크 배열과 사이클 배열을 사용하지 않고 풀이하면 시간초과가 발생할 수 있다.

Comments