본문 바로가기
Problem Solving/DFS, BFS

[DFS, BFS] 백준 9466번 : 텀 프로젝트 / 골드 3

by ggyongi 2021. 8. 24.
반응형

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

 

9466번: 텀 프로젝트

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

www.acmicpc.net

import sys
input = sys.stdin.readline

tc = int(input())
for _ in range(tc):
    n = int(input())
    lst = list(map(int, input().split()))

    visited = [False for _ in range(n)]
    cycle = [False for _ in range(n)]

    for i in range(n):
        if visited[i]:
            continue

        visited[i] = True
        cur = i
        order = [cur]
        while True:
            next = lst[cur]-1
            if visited[next]:
                if next not in order:
                    break
                else:
                    j = order.index(next)
                    for k in range(j, len(order)):
                        cycle[order[k]] = True
                    break

            visited[next] = True
            order.append(next)
            cur = next

    print(n-sum(cycle))

확신없이 일단 제출을 해봤는데 한번에 통과가 되어 당황한 문제.

 

12번째줄 코드부터 진행 방식은 대략 다음과 같다.

O(N)짜리 반복문을 돈다. 노드 번호는 i 로 설정. (인덱스임을 헷갈리지 않도록 주의)

방문체크가 되어있으면 통과, 안되어있으면 계속 진행.

i을 cur로 설정하고 order 리스트를 만들어 cur를 담아준다.

그리고 while 문 안에 들어가서,

next 노드를 꺼내와서 

next 노드가 방문 체크가 안되어있으면? -> 방문체크 + order 리스트 안에 추가

next 노드가 방문 체크가 되어있으면? -> order 안에 이 next가 들어있다면 싸이클을 발견한 것이고, 안에 없다면 이미 탐색을 완료한 노드임.

싸이클을 발견했다면 order 안에 next의 위치를 찾아 끝까지 탐색하면서 해당 노드의 싸이클 여부를 True로 설정해주면 된다.

 

 

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글