문제풀이/DFS & BFS

[파이썬] [DFS] 백준 2668 숫자고르기

승무_ 2023. 2. 14. 13:04

문제

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

 

2668번: 숫자고르기

세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다. 첫째 줄의 각 칸에는 정수 1, 2, …, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 N이하인 정수가 들어 있다. 첫째 줄에서 숫자를 적절

www.acmicpc.net

코드

n=int(input())
graph=[[] for _ in range(n+1)]
for i in range(1,n+1):
    t=int(input())
    graph[i].append(t)

answer=set()

def dfs(first,second,num):
    #문제 그림의 첫번째 줄
    first.add(num)
    #문제 그림의 두번째 줄
    second.add(graph[num][0])

    if graph[num][0] in first:
        #첫번째 줄 집합과 두번째 줄 집합이 같다면
        if first==second:
            answer.update(first)
            return True
        else:
            return False
    else:
        dfs(first,second,graph[num][0])

for i in range(1,n+1):
    dfs(set(),set(),i)

print(len(answer))
print(*sorted(list(answer)),sep="\n")