๋ฐฑ์ค€ - ์ˆœ์—ด ์‚ฌ์ดํด(Swift)

2022. 12. 3. 16:03ใ†Algorithm

๋ฐฑ์ค€ - ์ˆœ์—ด ์‚ฌ์ดํด(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
}