Swift Data Structure And Algorithm/Graph Algorithm

์ด์ƒํ•œ ๊ณ„์‚ฐ๊ธฐ

youngjaeLee1026 2022. 4. 15. 13:19

1. ๋ฌธ์ œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-15 13 07 19

2. ์ž…์ถœ๋ ฅ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-15 13 07 29

3. ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-15 13 07 38

4. ๋ฌธ์ œ ์„ค๊ณ„

  • ์œ„ ๋ฌธ์ œ๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ๋– ์˜ฌ๋ฆฌ๋Š”๊ฒŒ ํž˜๋“ค์—ˆ๋˜ ๋ฌธ์ œ
  • ๋‹จ์ˆœํžˆ * 2 ์—ฐ์‚ฐ๊ณผ / 3 ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•ด์„œ ์ง„ํ–‰ํ•˜๋‹ค๋ณด๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
  • ๋˜, * 2 ์—ฐ์‚ฐ ์‹œ 5์ž๋ฆฌ ์ด์ƒ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด์ฃผ์–ด์•ผ ํ•จ
  • ์œ„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด์„œ ํ˜„์žฌ ๊ฐ’์—์„œ * 2 ํ•œ ์œ„์น˜, / 3 ํ•œ ์œ„์น˜๋ฅผ ๊ฐ๊ฐ์˜ ๋…ธ๋“œ๋กœ ๋ณด๊ณ  ํ•ด๋‹น ์œ„์น˜์— ๋Œ€ํ•ด
  • BFS๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฏธ๋กœ ์ฐพ๊ธฐ ๋ฌธ์ œ์—์„œ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๋“ฏ์ด ์ด์ „ ๋ฒ„ํŠผ ํšŸ์ˆ˜ + 1์„ ๊ฐ๊ฐ์˜ ์œ„์น˜์— ๋ˆ„์ ํ•˜๊ณ ,
  • ์ตœ์ข…์ ์œผ๋กœ ์›ํ•˜๋Š” ๊ฐ’์˜ ์œ„์น˜์˜ ๋ฒ„ํŠผ ํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ
  • BFS๋กœ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์œ„์น˜(์—ฐ์‚ฐ ๊ฒฐ๊ณผ)๋ฅผ ์ตœ์ดˆ์— ๋ฐœ๊ฒฌํ–ˆ์„ ๋•Œ ๋ˆ„์  ๊ฐ’์ด ์ตœ์†Ÿ๊ฐ’์ž„์ด ๋ณด์žฅ๋˜๊ณ , ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜๋ฏ€๋กœ ๋‘๋ฒˆ ์ด์ƒ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํ•˜๊ฒŒ ์ •๋‹ต์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ

5. ์ „์ฒด ์ฝ”๋“œ

//MARK: - ์ด์ƒํ•œ ๊ณ„์‚ฐ๊ธฐ

//MARK: - Framework
import Foundation

//MARK: - Variable
var N: Int = 0
let MAX: Int = 1000000
var visited: [Bool] = []

//MARK: - Function
func bfs(_ start: Int) -> Int {
    var counts: [Int] = Array(repeating: 0, count: MAX)
    var queue: [Int] = []
    var mul: Int = 0
    var div: Int = 0
    
    queue.append(start)
    visited[start] = true
    
    while !queue.isEmpty {
        let current: Int = queue.removeFirst()
        
        if current * 2 < MAX {
            mul = current * 2
        }
        div = current / 3
        
        if !visited[mul] {
            visited[mul] = true
            queue.append(mul)
            counts[mul] = counts[current] + 1
        }
        
        if !visited[div] {
            visited[div] = true
            queue.append(div)
            counts[div] = counts[current] + 1
        }
    }
    
    return counts[N]
}

func solution() -> Void {
    //MARK: - Input
    var result: Int = 0
    N = Int(readLine() ?? "0") ?? 0
    visited = Array(repeating: false, count: MAX)
    
    //MARK: - Process
    result = bfs(1)
    
    //MARK: - Output
    print(result)
}
solution()

 

์ „์ฒด์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.