[백준/Python]10451_순열 사이클

2021. 6. 15. 13:47백준 알고리즘

문제

https://www.acmicpc.net/problem/10451

 

10451번: 순열 사이클

1부터 N까지 정수 N개로 이루어진 순열을 나타내는 방법은 여러 가지가 있다. 예를 들어, 8개의 수로 이루어진 순열 (3, 2, 7, 8, 1, 4, 5, 6)을 배열을 이용해 표현하면 \(\begin{pmatrix} 1 & 2 &3&4&5&6&7&8 \\  3

www.acmicpc.net

풀이

간선의 비용이 전부 1로 같기 때문에 BFS를 사용했습니다.

딕셔너리 타입의 edges 변수에 (현재 노드: 연결된 다음 노드)의 형태로 값을 push합니다.

BFS로 사이클의 갯수를 셉니다. 사이클을 찾으면 사이클 안에 포함된 노드들을 cycle_components 리스트에 넣어서 다음 사이클 탐색시 이미 사이클로 판명된 노드를 재연산하지 않도록 합니다.

코드

import sys
from collections import deque


def bfs(n, edges):
    cycle_cnt = 0
    cycle_components = []
    for i in range(1, n + 1):
        if i in cycle_components:
            continue
        q = deque([i])
        temp = [i]
        while q:
            node = q.popleft()
            if edges[node] == i:
                cycle_cnt += 1
                cycle_components += temp
                break
            temp.append(edges[node])
            q.append(edges[node])
    return cycle_cnt


t = int(sys.stdin.readline().rstrip())
answer = []
for _ in range(t):
    n = int(sys.stdin.readline().rstrip())
    lst = list(map(int, sys.stdin.readline().rstrip().split()))
    edges = dict()
    for i in range(len(lst)):
        edges[i + 1] = lst[i]
    answer.append(bfs(n, edges))
for i in answer:
    print(i)

'백준 알고리즘' 카테고리의 다른 글

[백준/Python]2004_조합 0의 개수  (0) 2021.06.16
[백준/Python]9251_LCS  (0) 2021.06.16
[백준/Python]10971_외판원 순회 2  (0) 2021.06.14
[백준/Python]13305_주유소  (0) 2021.06.14
[백준/Python]1120_문자열  (0) 2021.06.14