10451 - 순열 사이클
문제
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 순열의 크기 N (2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 순열이 주어지며, 각 정수는 공백으로 구분되어 있다.
출력
각 테스트 케이스마다, 입력으로 주어진 순열에 존재하는 순열 사이클의 개수를 출력한다.
제출코드
import sys
sys.setrecursionlimit(10000)
def dfs(start):
visited[start] = True
next_path = path[start]
if not visited[next_path]:
dfs(next_path)
for _ in range(int(sys.stdin.readline())):
n = int(sys.stdin.readline())
path = [0] + list(map(int, sys.stdin.readline().split()))
visited = [True] + [False] * n
ans = 0
for i in range(1, n+1):
if not visited[i]:
dfs(i)
ans += 1
print(ans)
문제 풀이
문제 핵심은 DFS
이다.
DFS
를 통해 그래프를 순회하며 DFS
가 실행될 때 마다 cnt
값을 올려주면 싸이클의 개수를 확인할 수 있다.
DFS
를 순회할 때 마다 연결된 노드들은 모두 순회할 것이기 때문에 DFS
한번에 사이클 한번을 순회할 수 있다.
값을 입력받고 순열을 모델링하여 그래프화 한다, 방문 여부를 저장하기 위한 변수 visited
도 정의한다.
이후 모든 노드에 방문여부를 순회하는 루프를 통해 순차적으로 접근하며 만일 i번째 노드를 방문하지 않았을 경우, 해당 노드를 시작점으로 하는 DFS
를 실행한다.
cf) recursion limit 제한을 풀지 않으면 런타임 에러가 발생한다.
'Algorithm & SQL > Baekjoon' 카테고리의 다른 글
[Algorithm] [Python] Programmers - 가장 큰 수 (0) | 2020.05.30 |
---|---|
[Algorithm] [Python] 백준/BOJ - 4539 _ 반올림 (0) | 2020.05.30 |
[Algorithm] [Python] 백준/BOJ - 9095 _ 1, 2, 3 더하기 (0) | 2020.05.26 |
[Algorithm] [Python] 백준/BOJ - 11724 _ 연결 요소의 개수 (0) | 2020.05.24 |
[Algorithm] [Python] 백준/BOJ - 1929 _ 소수 구하기 (0) | 2020.05.22 |