백준
BOJ 백준 파이썬 2668 숫자 고르기
데이터봇
2022. 6. 29. 18:18
문제의 조건인데
1:[3]
2:[1]
3:[1]
4:[5]
5:[5]
6:[4]
7:[6]
이것을 그래프로 그려보면
1,3,5는 사이클을 이룸을 알 수 있다.
사이클을 이루는 원소들을 찾아내는 것이 문제 풀이 방법이란 것을 알 수 있다.
방향 그래프란 것도 낯설었고 문제의 조건을 보자마자 그래프를 이용한 사이클 문제라는 것을
떠올리는 것도 아직은 쉽지 않아 보인다.
문제 풀이 경험을 더 해야한다.
사이클을 찾는 방법은 기본적으로 dfs 탐색으로 각 정점을 방문하다가
이미 방문했던 정점을 또 방문하면 사이클을 형성하는 것이다.
16932 모양 만들기와 똑같은 문제다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
import sys
from collections import deque
from itertools import combinations
def dfs(x):
if ch[x]==1:
if x in cycle:
for num in cycle[cycle.index(x):]:
res.add(num)
else:
ch[x]=1
cycle.append(x)
y=graph[x]
dfs(y)
if __name__=='__main__':
sys.stdin=open("input2.txt", "rt")
n=int(input())
graph=[]
for _ in range(n):
x=int(input())
x-=1
graph.append(x)
ch=[-1]*n
res=set()
for i in range(0,n):
if ch[i]==-1:
cycle=[]
dfs(i)
res=list(res)
res.sort()
print(len(res))
for x in res:
print(x+1)
|
cs |