Input
첫째 줄에 테스트 케이스의 개수 T가 주어진다.
각 테스트 케이스의 첫째 줄에는 순열의 크기 N (2 ≤ N ≤ 1,000)이 주어진다.
둘째 줄에는 순열이 주어지며, 각 정수는 공백으로 구분되어 있다.
1 | T = int(input()) |
BFS
각 index에 들어있는 value를 다시 index로 설정해서
visited[index] == False
일 때까지 이를 반복한다.결국 queue가 빌 때까지 이를 반복한다고 생각하면, BFS로 해결할 수 있다.
해당 사이클이 모두
visited
라면, 1을 반환하여count++
한다.1
2
3
4
5
6
7
8
9
10
11def bfs(idx):
queue = [idx]
while queue:
now = queue.pop(0)
if not visited[now]:
visited[now] = True
val = P[now]
queue.append(val)
return 1이후 다음 사이클로 넘어가야 하는데, 이는 결국 배열의 모든 요소를 돌아 사이클을 확인해봐야 하는 것과 같다. 따라서
visited
를 활용해 이미 방문한 요소 외의 것들의 사이클을 확인한다.1
2
3
4
5
6
7visited = [False for _ in range(N+1)]
count = 0
# idx -> val -> idx 계속 따라가기
for idx in range(1, N+1):
if not visited[idx]:
count += bfs(idx)
Better Solution
1 | ### 런타임 에러 바로잡기!!! `sys.setrecursionlimit(2000)` |
Output
각 테스트 케이스마다, 입력으로 주어진 순열에 존재하는 순열 사이클의 개수를 출력한다.
1 | print(count) |