카테고리 없음

[백준] 2688번 숫자고르기(python)

Magin 2022. 3. 10. 13:22
728x90

문제)

알고리즘)

DFS

- graph(1~n까지 오름차순의 수) = 문제에서 첫번째 행, bol(graph인덱스에 대응하는 값) 구성

- 0은 고려대상 X  그러므로 탐색 범위(1~n) 

- 탐색 과정 중에 first와 second에 해당하는 집합이 동일하다면 result에 업데이트 하여 저장

 

모든 탐색을 마친 후 result는 조건에 만족하는 최대 갯수의 집합을 오름차순으로 출력  

 

코드)

#숫자고르기
import sys
input = sys.stdin.readline

num = int(input())

graph = [n for n in range(0,num+1)]
bol = [0] # 번호순 1~n을 맞춰주기 위한 index0값의 데이터는 0
result= set()
for _ in range(num):
    bol.append(int(input())) #해당 번호값에 맞게 설정

def dfs(first, second, num):
    first.add(num) #첫줄 집합 추가
    second.add(bol[num]) #두번째줄 집합 추가
    if bol[num] in first:
        if  first == second: #조건에 충족된다면 result 갱신
            result.update(first)
            return True
        return False
    return dfs(first, second, bol[num]) 

for i in range(1,num+1): #1~n까지 탐색
    if i not in result: #해당 번호가 탐색
        dfs(set(), set(), i)
print(len(result))
print(*sorted(list(result)), sep="\n")
728x90