코딩테스트/BOJ

[백준][DFS] 2668.숫자고르기

박소민 2025. 1. 21. 22:08
2668.숫자고르기

 

  • 내 풀이
    • 1,2번 행끼리의 집합이 동일해야 한다
      • 1번행을 인덱스, 2번 행을 val로 두기
      • dfs 돌면서 사이클 찾기
    • 최대 길이 이므로 사이클 끼리 더함
    • 앞 사이클에서 진행된 애들은 다시 체크할 필요 X
  • 처음에 바보같이 이미 존재하는 값의 위치를 bisect_left로 찾아서 틀림
  • 순서대로 들어가있는게 아니기때문에 index로 찾아야함
n=int(input())
lst=[0]+[int(input()) for _ in range(n)]
answer=[]

def dfs(val):
    global answer
    if val in picked:
        i=picked.index(val)
        answer+=picked[i:]
        return

    picked.append(val)
    dfs(lst[val])
    return

for idx, val in enumerate(lst):
    if idx==0: continue
    if idx in answer or val in answer: continue
    picked = []
    picked.append(idx)
    dfs(val)

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

 

'코딩테스트 > BOJ' 카테고리의 다른 글

[백준][DP] 동전 2  (0) 2025.01.27
[백준] 2623. 음악프로그램  (0) 2025.01.24
[백준][부분합] 2632. 피자판매  (0) 2024.12.12
[백준][구현] 20210. 파일 탐색기  (0) 2024.11.18
[백준][DP] 2293. 동전 1  (0) 2024.10.22