0. 문제 링크
https://www.acmicpc.net/problem/2668
2668번: 숫자고르기
세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다. 첫째 줄의 각 칸에는 정수 1, 2, …, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 N이하인 정수가 들어 있다. 첫째 줄에서 숫자를 적절
www.acmicpc.net
1. 풀이 방법
해당 문제는 단순히 사이클이 존재하는 노드를 집합으로 넣으면 되는 문제이다.
나는 전혀 최적화를 하지 않고, 모든 노드를 살펴보면서 탐색하게 하였다.
물론 이 방법이 좋은 것은 아니지만, 그래도 꽤 시간은 빨랐다.
아무튼 DFS를 하다가 특정 노드가 이미 True로 설정되어 있다면, 이는 사이클이 생긴 것이므로 이를 ans set에 넣고 반환하게 하였다.
2. 코드
def dfs(start):
if visited[start]: # 싸이클이 생김
ans.add(start)
return
else:
visited[start] = True
dfs(adj[start])
visited[start] = False
if __name__ == "__main__":
n = int(input())
ori = list(range(1, n + 1))
lst = [int(input()) for _ in range(n)]
visited = [False] * (n + 1)
ans = set() # 정답 세트
adj = dict() # 인접리스트
for i in range(n):
adj[i + 1] = lst[i] # 인접리스트를 만듬
for i in range(1, n + 1):
dfs(i) # 1부터 차레대로 사이클을 찾음
print(len(ans))
print(*sorted(list(ans)), sep='\n')
3. 마무리
아무 생각 없이 문제 풀었는데, 맞아서 몹시 당황했다.
'Computer Science > 알고리즘' 카테고리의 다른 글
[백준 - Python] 2374 - 같은 수로 만들기 (0) | 2023.03.11 |
---|---|
[백준 - Python] 1967 - 트리의 지름 (0) | 2023.03.11 |
[백준 - Python] 7569 - 토마토 (0) | 2023.03.08 |
[백준 - Python] 2573 - 빙산 (0) | 2023.03.08 |
[백준 - Python] 19236 - 청소년 상어 (2) | 2023.03.08 |