๐Ÿ“ ์ฝ”ํ…Œ/BOJ

[Swift] ๋ฐฑ์ค€1389 ์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ 6๋‹จ๊ณ„ ๋ฒ•์น™

JerryiOS 2023. 3. 30. 00:20

import Foundation

/// ์ผ€๋นˆ ๋ฒ ์ด์ปจ ์ˆ˜ : ๋ชจ๋“  ์‚ฌ๋žŒ๊ณผ ์ผ€๋นˆ ๋ฒ ์ด์ปจ ๊ฒŒ์ž„์„ ํ–ˆ์„ ๋•Œ ๋‚˜์˜ค๋Š” ๋‹จ๊ณ„์˜ ํ•ฉ
/// BOJ ์œ ์ €๊ฐ€ 5๋ช…์ด๊ณ , 1-3, 1-4, 2-3, 3-4, 4-5๊ฐ€ ์นœ๊ตฌ์ธ ๊ฒฝ์šฐ
/// 1์€ ์นœ๊ตฌ์™€ ์ด์–ด์ง€๊ธฐ ์œ„ํ•ด 1-3-2, 1-3, 1-4, 1-4-5 ์ด๋Ÿฐ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค. ์ฆ‰ ์ผ€๋นˆ ๋ฒ ์ด์ปจ ์ˆ˜๋Š” 2 + 1 + 1 + 2 = 6์ด๋‹ค.
/// BOJ ์œ ์ €์˜ ์ˆ˜์™€ ์นœ๊ตฌ๊ด€๊ณ„๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ผ€๋นˆ ๋ฒ ์ด์ปจ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ์‚ฌ๋žŒ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
/// N : ์œ ์ €์˜ ์ˆ˜
/// M : ์นœ๊ตฌ๊ด€๊ณ„์˜ ์ˆ˜

let NM = readLine()!.components(separatedBy: " ").map { Int($0)! }
let N = NM[0]
let M = NM[1]

var graph = [String: [String]]()

for i in 1...N {
    graph[String(i)] = []
}

for _ in 1...M {
    let AB = readLine()!.components(separatedBy: " ").map { Int($0)! }
    let A = String(AB[0])
    let B = String(AB[1])
    graph[A]?.append(B)
    graph[B]?.append(A)
}

var kbNumArr = [Int]()
for i in 1...N {
    kbNumArr.append(BFS(n: String(i)))
}

print(kbNumArr.firstIndex(of: kbNumArr.min()!)! + 1)

// n๋ฒˆ ์œ ์ €์˜ ์ผ€๋นˆ ๋ฒ ์ด์ปจ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
func BFS(n: String) -> Int {
    var visitedQueue: [String] = []
    var needVisitQueue: [String] = [n]
    var tempFloor: Set<String> = [n]    // ํ˜„์žฌ ์ธต์˜ ๋…ธ๋“œ๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด
    var currentFloor = 0    // ํ˜„์žฌ ์ธต
    var cnt = 0
    
    while !needVisitQueue.isEmpty {

        let node: String = needVisitQueue.removeFirst()
        if visitedQueue.contains(node) { continue }
        
        // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฉด ์•„๋ž˜ ํ•จ์ˆ˜ ์‹คํ–‰
        
        /// ํ˜„์žฌ์ธต ๋…ธ๋“œ๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด์— ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
        /// ์ธ์ ‘ํ•œ ๋ฐฐ์—ด ์ค‘์—์„œ
        /// ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋งŒ ๊ฐ€์ ธ์™€์„œ ๋‹ด๊ณ  ์ธต์ˆ˜๋ฅผ ์˜ฌ๋ ค๋ผ
        if !tempFloor.contains(node) {
            for currentFloorNode in tempFloor {
                for adjacentNode in graph[currentFloorNode] ?? [] {
                    if !visitedQueue.contains(adjacentNode) {
                        tempFloor.insert(adjacentNode)
                        tempFloor.remove(currentFloorNode)
                    }
                }
            }
            currentFloor += 1
        }
        
        
        visitedQueue.append(node)
        needVisitQueue += graph[node] ?? []

        cnt += currentFloor
    }
    
    return cnt
}

ํ’€์—ˆ๋˜ ์•„์ด๋””์–ด

1. bfs์™€ ๊ด€๋ จ๋œ ๋กœ์ง์€ https://jerry311.tistory.com/38 ์ด์ชฝ์—์„œ ๋‹ค๋ค˜๋˜ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

2. ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ• ๋•Œ๋งˆ๋‹ค tempFloor ๋ฐฐ์—ด์— ํ˜„์žฌ ์ธต์˜ ๋…ธ๋“œ๋ฅผ ๋ฐฐ์—ด๋กœ ์ €์žฅํ•จ

0์ธต - 1

1์ธต - 3, 4

2์ธต - 2, 5

 

3. ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ์ธต๋งˆ๋‹ค ๋…ธ๋“œ๋ฅผ ๋„ฃ์–ด๋†“๊ณ  ๋‹ค๋ฅธ ๊ฐ’์ด ๋“ค์–ด์˜ฌ๋•Œ๋งˆ๋‹ค currentFloor๋ฅผ ํ•˜๋‚˜์”ฉ ๋”ํ•ด์คฌ๋‹ค.

4. ์ธต์ˆ˜๊ฐ€ ๊ฒฐ๊ตญ ๊ฑฐ๋ฆฌ์˜ ์ˆ˜๋‹ˆ๊นŒ ๊ทธ๊ฑธ ๋”ํ•ด์„œ ์ผ€๋นˆ ๋ฒ ์ด์ปจ ์ˆ˜๋ฅผ ๊ตฌํ–ˆ๋‹ค.

๋ฐ˜์‘ํ˜•