본문 바로가기
✨ 서울대생이 면접 떨어지고 6개월간 삽질하며 정리한 'CS 정리 노트', 지금 무료로 풀립니다!
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로 설정해주면 된다.

 

 

 

[지금 무료]컴퓨터 구조: 면접 탈락을 끝낸 궁극의 CS 정리 노트 강의 | 이용준 - 인프런

이용준 | 실무와 면접에서 자주 마주치는 컴퓨터 구조 개념만 선별해, 도해 중심으로 쉽게 설명하고 정리한 핵심 CS(computer-science) 강의입니다. 처음 접하는 사람도 흐름을 잡고, 이후 학습을 빠르

www.inflearn.com

📘 비전공자 개발자 취업 성공기 시리즈

개발자가 되고 싶었던 한 비전공자의 1년 4개월 이야기
막막했던 시작부터 좌절, 그리고 합격까지의 여정을 기록했습니다

 

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

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

kmong.com

댓글