MUKER_DEV with iOS

[swift] ๋ฐฑ์ค€ - 9466๋ฒˆ: ํ…€ ํ”„๋กœ์ ํŠธ ๋ณธ๋ฌธ

๐Ÿค– ์•Œ๊ณ ๋ฆฌ์ฆ˜/BAEKJOON

[swift] ๋ฐฑ์ค€ - 9466๋ฒˆ: ํ…€ ํ”„๋กœ์ ํŠธ

MUKER 2023. 5. 10. 22:07
 

9466๋ฒˆ: ํ…€ ํ”„๋กœ์ ํŠธ

์ด๋ฒˆ ๊ฐ€์„ํ•™๊ธฐ์— '๋ฌธ์ œ ํ•ด๊ฒฐ' ๊ฐ•์˜๋ฅผ ์‹ ์ฒญํ•œ ํ•™์ƒ๋“ค์€ ํ…€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ํ”„๋กœ์ ํŠธ ํŒ€์› ์ˆ˜์—๋Š” ์ œํ•œ์ด ์—†๋‹ค. ์‹ฌ์ง€์–ด ๋ชจ๋“  ํ•™์ƒ๋“ค์ด ๋™์ผํ•œ ํŒ€์˜ ํŒ€์›์ธ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ํ•œ ํŒ€๋งŒ ์žˆ์„

www.acmicpc.net


์„ฑ๊ณต ํ’€์ด

for _ in 0..<Int(readLine()!)! {
    let n = Int(readLine()!)!
    let choice = [0]+readLine()!.split(separator: " ").map { Int($0)! }
    var visited = Array(repeating: false, count: n+1)
    var finish = Array(repeating: false, count: n+1)
    var result = n
    
    func dfs(_ num: Int) {
        visited[num] = true
        let next = choice[num]
        
        if !visited[next] { dfs(next) }
        else if !finish[next] {
            var i = next
            
            while i != num {
                result -= 1
                i = choice[i]
            }
            result -= 1
        }
        finish[num] = true
    }
    
    for i in 1...n {
        if !visited[i] {
            dfs(i)
        }
    }
    print(result)
}

ํ’€์ด ํ‚ค์›Œ๋“œ

BFS