알고리즘 저장소

백준 - 11558번 The Game of Death (Graph, Silver4, Python)

Diger 2022. 7. 29. 16:06
728x90

문제

희현이와 주경이는 The Game of Death를 좋아한다.

The Game of Death 규칙:

플레이어는 각자 한 명씩 지목을 한다(자신도 가능).
처음 시작하는 사람은 임의의 자연수 K를 말한다.
시작한 사람부터 지목한 사람을 차례대로 따라가다가 K번째 지목당한 사람이 걸리게 된다.

희현이는 희현이부터 이 게임을 시작할 때 이 게임에서 반드시 주경이를 반드시! 걸리게 하고 싶다. 주경이가 걸릴 수 있도록 희현이를 도와주자.


입력

첫 줄에는 테스트 케이스의 숫자 T가 주어지며, 이어서 T번에 걸쳐 테스트 케이스들이 주어진다.

매 테스트 케이스의 첫 줄에는 플레이어의 숫자 N(1 ≤ N ≤ 10,000)이 주어진다.

이어서 N줄에 걸쳐 각 플레이어가 지명한 사람의 숫자 Ai(1 ≤ Ai ≤ N, 1 ≤ i ≤ N)이 주어진다.

희현이는 1번, 주경이는 N번이다,


출력

매 테스트 케이스마다 한 줄에 걸쳐 희현이가 주경이를 걸리게 하고 싶을 때 불러야 하는 최소 숫자 K를 출력한다.

만약 어떤 숫자를 말해도 주경이가 걸리지 않는다면 0을 출력해야 한다.


풀이 - DFS

from collections import deque
import sys

input = sys.stdin.readline

test_case = int(input())


def dfs(start, target, graph):
    visited = []
    stack = [graph[start]]
    count = int(0)

    # print("graph[start] =" , graph[start])
    # print(stack)

    while stack:
        current = stack.pop()

        if current == target:
            return count + 1

        # 한번도 지목 당하지 않은 사람의 경우
        # 방문 처리
        # 그 사람이 가리키는 다음 사람 스택에 넣기
        elif current not in visited:
            visited.append(current)
            stack.append(graph[current])
            count += 1
        else:
            return 0


for i in range(test_case):
    person_num = int(input())
    graph = [0]
    for j in range(person_num):
        graph.append(int(input()))

    if person_num not in graph:
        print(0)

    else:
        print(dfs(1, person_num, graph))
728x90