λ°±μ€ - μμ΄ μ¬μ΄ν΄(Swift)
λ°±μ€ - μμ΄ μ¬μ΄ν΄(Swift)
λ¬Έμ μ€λͺ
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
λμ νμ΄
μ²μ λ¬Έμ λ₯Ό λ΄€μλλ μ 3 2 7 8 1 4 5 6μ μμ΄μ΄ μ€λ₯Έμͺ½μ²λΌλλκ±΄μ§ μ΄ν΄λ₯Ό νμ§ λͺ»νλ€.
μ΄λ κ²°κ΅ 1λΆν°μ μΈλ±μ€μ μ΄ μ«μλ€κ°μ κ°μ μ΄μμμ λνλ΄λ κ²μμ μμκ³ μ¬μ΄ν΄μ΄ λͺκ° μ‘΄μ¬νλ©΄λλμ§λ₯Ό νμΈνλ©΄ λκΈ° λλ¬Έμ μ¬κ·λ°©λ²μΌλ‘ λ¬Έμ λ₯Ό ν΄κ²°νλ€.
νμ§λ§ μ΄λ ν μ΄μ λ‘ μκ°μ΄κ³Όκ° λμ λ¬Έμ λ₯Ό ν΄κ²°νμ§ λͺ»νμλλ° μλμ½λκ° λμ μ²μ μ½λμ΄λ€.
import Foundation
let tc = Int(readLine()!)!
var visited = [Bool]()
var arr = [Int]()
var result = 0
func cycle(_ num: Int) {
visited[num] = true
if !visited[arr[num]] { cycle(arr[num]) }
}
for _ in 0..<tc {
let N = Int(readLine()!)!
arr = Array(repeating: 0, count: N+1)
visited = Array(repeating: false, count: N+1)
let input = readLine()!.components(separatedBy:" ").map{Int($0)!}
for i in 1..<N+1 {
arr[i] = input[i-1]
}
for i in 1..<N+1 {
if !visited[i] {
cycle(i)
result += 1
}
}
print(result)
result = 0
}
cycleν¨μμμ νμ¬ νμμ€μΈ κ°μ λ°©λ¬Ένμνκ³ κ·Έ κ°μ΄ κ°λ¦¬ν€λ κ°μ΄ λ°©λ¬Έλμ§μμλ€λ©΄ λ€μ μ¬μ΄ν΄ν¨μλ₯Ό νΈμΆνλ λ°©μμΌλ‘ μ½λλ₯Ό μμ±νμλλ° μ΄λ μκ°μ΄κ³Όλ₯Ό λ΄κΈ°μ μ ν©ν μ½λμλ€.
μλ₯Όλ€μ΄ cycleν¨μκ° μ°μμΌλ‘ 500λ² νΈμΆλμλ€κ³ κ°μ ν΄λ³΄μ.
κ·Έλ λ€λ©΄ 첫λ²μ§ΈλΆν° 500λ²μ§ΈκΉμ§ λ°©λ¬Έλμ§ μμ κ°λ€μ΄μλ€λ κ²μΈλ° μ΄λ 501λ²μ§Έμ λ°©λ¬Ένλ κ²μ΄μλ€λ©΄ λ°λ‘ λͺ¨λ μ¬μ΄ν΄μ΄ μ’ λ£κ° λλκ²μ΄ μλλΌ 500, 499, 498λ²μ§Έμ ν¨μκ° μμ°¨μ μΌλ‘ λλλ©΄μ μ’ λ£νκ² λλ€.
μ¦ ν¨μμμ ν¨μμμ ν¨μκ° μλ ννμλ κ²μ΄λ€.
μ΄λ₯Ό λ€μμ μ½λλ‘ ν΄κ²°ν μ μλ€.
λ°©λ¬Έλμλ€λ©΄ λ°λ‘ return trueλ₯Ό μ€μΌλ‘μ¨ ν¨μλ₯Ό μ’ λ£μν¬ μ μκ³ , λ°©λ¬Έλμ§μμ μνλΌλ©΄ return ν¨μλ₯Ό μ€μΌλ‘μ¨ ν¨μμμ ν¨μκ° μλ κ²μ΄ μλ μλ‘μ΄ ν¨μλ‘ μ€μ½νκ° μ΄λλκ² λ§λ€ μ μλ€.
import Foundation
let tc = Int(readLine()!)!
var visited = [Bool]()
var arr = [Int]()
var result = 0
func cycle(_ num: Int) -> Bool {
visited[num] = true
if visited[arr[num]] { return true }
return cycle(arr[num])
}
for _ in 0..<tc {
let N = Int(readLine()!)!
arr = Array(repeating: 0, count: N+1)
visited = Array(repeating: false, count: N+1)
let input = readLine()!.components(separatedBy:" ").map{Int($0)!}
for i in 1..<N+1 {
arr[i] = input[i-1]
}
for i in 1..<N+1 {
if !visited[i] {
if cycle(i) {
result += 1
}
}
}
print(result)
result = 0
}