πŸ“š Study/Baekjoon

[Silver III] 10451 - μˆœμ—΄ 사이클

윰갱 2025. 4. 9. 22:32

 

문제

1λΆ€ν„° NκΉŒμ§€ μ •μˆ˜ N개둜 이루어진 μˆœμ—΄μ„ λ‚˜νƒ€λ‚΄λŠ” 방법은 μ—¬λŸ¬ κ°€μ§€κ°€ μžˆλ‹€. 예λ₯Ό λ“€μ–΄, 8개의 수둜 이루어진 μˆœμ—΄ (3, 2, 7, 8, 1, 4, 5, 6)을 배열을 μ΄μš©ν•΄ ν‘œν˜„ν•˜λ©΄ μ™€ κ°™λ‹€. λ˜λŠ”, Figure 1κ³Ό 같이 λ°©ν–₯ κ·Έλž˜ν”„λ‘œ λ‚˜νƒ€λ‚Ό μˆ˜λ„ μžˆλ‹€.

μˆœμ—΄μ„ 배열을 μ΄μš©ν•΄  λ‘œ λ‚˜νƒ€λƒˆλ‹€λ©΄, iμ—μ„œ Ο€i둜 간선을 이어 κ·Έλž˜ν”„λ‘œ λ§Œλ“€ 수 μžˆλ‹€.

Figure 1에 λ‚˜μ™€μžˆλŠ” 것 처럼, μˆœμ—΄ κ·Έλž˜ν”„ (3, 2, 7, 8, 1, 4, 5, 6) μ—λŠ” 총 3개의 사이클이 μžˆλ‹€. μ΄λŸ¬ν•œ 사이클을 "μˆœμ—΄ 사이클" 이라고 ν•œλ‹€.

N개의 μ •μˆ˜λ‘œ 이루어진 μˆœμ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ, μˆœμ—΄ μ‚¬μ΄ν΄μ˜ 개수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 Tκ°€ μ£Όμ–΄μ§„λ‹€. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 μ€„μ—λŠ” μˆœμ—΄μ˜ 크기 N (2 ≀ N ≀ 1,000)이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” μˆœμ—΄μ΄ μ£Όμ–΄μ§€λ©°, 각 μ •μˆ˜λŠ” 곡백으둜 κ΅¬λΆ„λ˜μ–΄ μžˆλ‹€.

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€, μž…λ ₯으둜 μ£Όμ–΄μ§„ μˆœμ—΄μ— μ‘΄μž¬ν•˜λŠ” μˆœμ—΄ μ‚¬μ΄ν΄μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯ 1

2
8
3 2 7 8 1 4 5 6
10
2 1 3 4 5 6 7 9 10 8

예제 좜λ ₯ 1

3
7

# 풀이 방법

μˆœμ—΄, μ‘°ν•© 이런 μ–˜κΈ°κ°€ λ‚˜μ™”κΈ° λ•Œλ¬Έμ— dfs둜 μ ‘κ·Όν–ˆλ‹€

κ΅μž¬μ—μ„œ ν’€μ—ˆλ˜ μ•„μ΄μŠ€ν¬λ¦Ό κ°œμˆ˜μ™€ λ™μΌν•œλ° κ·Έ κ²½μš°λŠ” μ’Œν‘œμ˜€κ³  이 κ²½μš°λŠ” μ’Œν‘œκ°€ μ•„λ‹ˆλ‹€.

 

dfsλ₯Ό κΈ°μ‘΄κ³Ό λ‹€λ₯΄κ²Œ μ •μ˜ν–ˆλ”λ‹ˆ 쑰금 ν—·κ°ˆλ Έλ‹€

ꡳ이 κ·Έλž˜ν”„λ₯Ό κΌ­ μ •μ˜ν•˜μ§€ μ•Šκ³ λ„ permutation μ•ˆμ—μ„œ 해결이 κ°€λŠ₯ν•˜κ΅¬λ‚­

 

# μ½”λ“œ

볡슡ver: ꡳ이 permκΉŒμ§€ 인자둜 건넀쀄 ν•„μš”λŠ” μ—†μ—ˆλ‹€

# 2024-04-18 11:55-12:05
import sys
sys.stdin = open("input.txt","r")

T = int(sys.stdin.readline().strip())

def dfs(curr, visited):
    visited[curr] = True
    next = perm[curr]

    if not visited[next]:
        dfs(next, visited)
    
for _ in range(T):
    N = int(sys.stdin.readline().strip())
    perm = [0] + list(map(int,sys.stdin.readline().split()))
    
    visited = [False] * (N+1)
    cnt = 0
    for i in range(1, N+1):
        if not visited[i]:
            dfs(i, visited)
            cnt+= 1
    print(cnt)
import sys
sys.stdin = open("input.txt", "r")

def dfs(graph, v, visited):
    visited[v] = True
    next_v = graph[v]
    if not visited[next_v]:
        dfs(graph, next_v, visited)

T = int(sys.stdin.readline().strip())
for _ in range(T):
    N = int(sys.stdin.readline().strip())
    perm = [0] + list(map(int, sys.stdin.readline().split()))
    visited = [False] * (N + 1)

    cnt = 0
    for i in range(1, N + 1):
        if not visited[i]:
            cnt += 1
            dfs(perm, i, visited)
    
    print(cnt)

## 였λ₯˜ν•΄κ²°

import sys
sys.stdin = open("input.txt", "r")

def dfs(graph, v, visited):
    visited[v] = True
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)

T = int(sys.stdin.readline().strip())
for _ in range(T):
    N = int(sys.stdin.readline().strip())
    perm = list(map(int, sys.stdin.readline().split()))

    graph = [[] for _ in range(N + 1)]
    for i in range(N):
        graph[i+1].append(perm[i])
        if i + 1 != perm[i]:
            graph[perm[i]].append(i+1)

    visited = [False] * (N + 1)

    cnt = 0
    for i in range(1, N + 1):
        if not visited[i]:
            cnt += 1
            dfs(graph, i, visited)
    
    print(cnt)

음... graph리슀트λ₯Ό ꡳ이 μ €μž₯ν•  ν•„μš”κ°€ μ—†μ—ˆλ‹€

perm λ°°μ—΄λ§Œ 있으면 이미 μ—°κ²° 정보가 λ‹€ μžˆλŠ” 것이기 λ•Œλ¬Έ

λŒ“κΈ€μˆ˜0