๋ฐฑ์ค€ - ๊ณตํ•ญ(Swift)

2022. 11. 3. 16:01ใ†Algorithm

๋ฐฑ์ค€ - ๊ณตํ•ญ(Swift)

 

 

 ๋ฌธ์ œ ์„ค๋ช…

 

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

 

10775๋ฒˆ: ๊ณตํ•ญ

์˜ˆ์ œ 1 : [2][?][?][1] ํ˜•ํƒœ๋กœ ๋„ํ‚น์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. 3๋ฒˆ์งธ ๋น„ํ–‰๊ธฐ๋Š” ๋„ํ‚น์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค. ์˜ˆ์ œ 2 : [1][2][3][?] ํ˜•ํƒœ๋กœ ๋„ํ‚น ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ , 4๋ฒˆ์งธ ๋น„ํ–‰๊ธฐ๋Š” ์ ˆ๋Œ€ ๋„ํ‚น ์‹œํ‚ฌ ์ˆ˜ ์—†์–ด์„œ ์ดํ›„ ์ถ”๊ฐ€์ ์ธ ๋„ํ‚น์€ ๋ถˆ

www.acmicpc.net

 

 

 ๋‚˜์˜ ํ’€์ด

 

์ƒ๋‹นํžˆ ์–ด๋ ค์› ๋˜ ๋ฌธ์ œ๋‹ค.

์ฒ˜์Œ ์ ‘๊ทผ์€ ๋น„ํ–‰๊ธฐ๊ฐ€ ๋„ํ‚นํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒŒ์ดํŠธ๊ฐ€ ์ฃผ์–ด์กŒ์„๋•Œ ๊ฐ€์žฅ ํฐ ๋ถ€๋ถ„์„ ๋ฐฐ์น˜ํ•˜๋ฉด ๋œ๋‹ค๋ผ๋Š” ์•„์ด๋””์–ด์˜€๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ด ์• ๋งคํ–ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด 1~6๊นŒ์ง€์˜ ๊ฒŒ์ดํŠธ๊ฐ€ ์žˆ๊ณ  3๊ฐœ์˜ ๋น„ํ–‰๊ธฐ๊ฐ€ ๊ฐˆ์ˆ˜์žˆ๋Š” ๊ฒŒ์ดํŠธ๊ฐ€ 6 6 6์œผ๋กœ ์ฃผ์–ด์กŒ๋‹ค๋ฉด

์ฒ˜์Œ 6์— ๋Œ€ํ•œ ๋ถ€๋ถ„์€ false๋กœํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ 6์ด ์•„๋‹๋•Œ 6-1 ์„ ํ•œ 5๋กœ ๋„ฃ๊ณ , ๋˜ 5๊ฐ€ false์ผ๋•Œ 5-1์„ ๋„ฃ์–ด์„œ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ์ด๋Š” ๋งŽ์€ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋‚ด๋†“๊ฒŒ ๋œ๋‹ค.

 

๊ฒฐ๊ตญ ๋‹ค๋ฅธ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์žฌ๊ท€๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜๋‹ค.

 

์ฒซ๋ฒˆ์งธ ํ•ต์‹ฌ์€ ๋™์ผํ•˜๋‹ค.

์ฃผ์–ด์ง„ ๊ฒŒ์ดํŠธ ์ค‘์—์„œ ๊ฐ€์žฅ ํฐ ๊ฒŒ์ดํŠธ๋ฅผ ๋ฐฐ์น˜ํ•˜์ž.

 

๋จผ์ € parents๋ผ๋Š” ๋ฐฐ์—ด์„ ๊ฐ๊ฐ 0~Gate์˜ ๊ฐœ์ˆ˜๊นŒ์ง€ ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ ๋’ค ๋„ํ‚น์ด ๊ฐ€๋Šฅ ํ•œ ๊ฒฝ์šฐ๋ฅผ 0๋ฒˆ ๊ฒŒ์ดํŠธ๊นŒ์ง€ ๊ฐ€์ง€์•Š์€ ๊ฒฝ์šฐ๋กœ ๋‘๊ณ  ๋„ํ‚น์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋ฅผ 0๋ฒˆ ๊ฒŒ์ดํŠธ์— ๋„๋‹ฌํ•œ ๊ฒฝ์šฐ๋กœ ๋‘์—ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ํ•œ ๋ฒˆ ๋„ํ‚น์„ํ•œ๋‹ค๋ฉด parents[node]๊ฐ’์„ 1๊ฐ์†Œํ•จ์œผ๋กœ์จ ํ•ด๋‹น ๋ฒˆํ˜ธ๊ฒŒ์ดํŠธ์—์„œ๋Š” ๋„ํ‚น์ด ๋ถˆ๊ฐ€ํ•œ ํ˜•ํƒœ๋กœ ๋‘์—ˆ๋‹ค.(ํ•ด๋‹น ๊ฒŒ์ดํŠธ๊ฐ€ ๋„ํ‚น์ด ๋ถˆ๊ฐ€ํ•œ ๊ฒƒ์ด์ง€ ๊ทธ์ „ ๊ฒŒ์ดํŠธ๋Š” ๋„ํ‚น์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ)

 

์ •๋ฆฌํ•˜์ž๋ฉด

๊ฐ ๋น„ํ–‰๊ธฐ์˜ ๊ฒŒ์ดํŠธ๋ฒˆํ˜ธ์— ๋Œ€ํ•ด์„œ root๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฐ root๊ฐ’์ด 0์ด๋ผ๋ฉด ๋น„ํ–‰๊ธฐ๋ฅผ ๋„ํ‚นํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋์ธ ๊ฒƒ์ด๋‹ค.

 

 

 

 

import Foundation

let G = Int(readLine()!)!
let P = Int(readLine()!)!

var parents = [Int]()
var gates = [Int]()
var total = 0
for i in 0..<G+1 {
    parents.append(i)
}

for _ in 0..<P {
    let gate = Int(readLine()!)!
    gates.append(gate)
}

for gate in gates {
    let root = find(gate)
    if root == 0 { // ๋„ํ‚นํ•  ๊ฒŒ์ดํŠธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„๊ฒฝ์šฐ
        break
    }
    parents[root] -= 1 // ๋„ํ‚นํ•œ ๊ณณ์€ -1์„ ํ•ด์„œ ๋‚˜์ค‘์— ๋‹ค์‹œ ๊ฒŒ์ดํŠธ์— ์ ‘๊ทผํ•˜๋ ค๊ณ ํ•  ๋•Œ ํ•œ ์นธ์˜†์œผ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋” ํ•œ๋‹ค.
    total += 1
}

print(total)

func find(_ node: Int) -> Int {
    if node == parents[node] { // ๋„ํ‚น์ด ์•„์ง ์•ˆ๋˜์–ด์žˆ๋‹ค๋ฉด 
        return node
    } else {
        parents[node] = find(parents[node]) // ํ•œ ๋ฒˆ ๊นŠ๊ฒŒ ํƒ์ƒ‰ํ•œ ๊ฐ’์„ ์„ค์ •ํ•จ์œผ๋กœ์จ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์ž„.
        return parents[node]
    }
}