๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
3๏ธโƒฃ Swift/Problem Solving

[Swift Algorithm] ์ˆจ๋ฐ”๊ผญ์งˆ BOJ #1697

by seolhee2750 2021. 10. 5.
๋ฌธ์ œ ์„ค๋ช…

์ˆ˜๋นˆ์ด๋Š” ๋™์ƒ๊ณผ ์ˆจ๋ฐ”๊ผญ์งˆ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” ํ˜„์žฌ ์  N(0 ≤ N ≤ 100,000)์— ์žˆ๊ณ , ๋™์ƒ์€ ์  K(0 ≤ K ≤ 100,000)์— ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” ๊ฑท๊ฑฐ๋‚˜ ์ˆœ๊ฐ„์ด๋™์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ, ์ˆ˜๋นˆ์ด์˜ ์œ„์น˜๊ฐ€ X์ผ ๋•Œ ๊ฑท๋Š”๋‹ค๋ฉด 1์ดˆ ํ›„์— X-1 ๋˜๋Š” X+1๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค. ์ˆœ๊ฐ„์ด๋™์„ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” 1์ดˆ ํ›„์— 2*X์˜ ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

์ˆ˜๋นˆ์ด์™€ ๋™์ƒ์˜ ์œ„์น˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ˆ˜๋นˆ์ด๊ฐ€ ๋™์ƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์ด ๋ช‡ ์ดˆ ํ›„์ธ์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์— ์ˆ˜๋นˆ์ด๊ฐ€ ์žˆ๋Š” ์œ„์น˜ N๊ณผ ๋™์ƒ์ด ์žˆ๋Š” ์œ„์น˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. N๊ณผ K๋Š” ์ •์ˆ˜์ด๋‹ค.

 

์ถœ๋ ฅ

์ˆ˜๋นˆ์ด๊ฐ€ ๋™์ƒ์„ ์ฐพ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ์ œ

์ž…๋ ฅ

5 17

์ถœ๋ ฅ

4

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
import Foundation

let info = readLine()!.split(separator: " ").map({Int(String($0))!})
var subin = info[0] // ์ˆ˜๋นˆ์ด์˜ ์‹œ์ž‘์ 
var target = info[1] // ๋™์ƒ ์œ„์น˜
var queue = [(subin, 0)] // ์ด๋™ํ•˜๋Š” ์ˆ˜๋นˆ์ด์˜ ์œ„์น˜์™€ ํ•ด๋‹น ์œ„์น˜๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ๊นŒ์ง€ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ํŠœํ”Œ๋กœ ๋‹ด์Œ
var found = false // ์ฐพ์•˜๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ถˆ ๋ณ€์ˆ˜
var visited = Array(repeating: 0, count: 100001) // ์ด๋ฏธ ์ˆ˜๋นˆ์ด๊ฐ€ ๋‹ค๋…€๊ฐ„ ์ž๋ฆฌ๋“ค์„ ์ฒดํฌํ•ด์ฃผ๊ธฐ ์œ„ํ•จ

var index = 0

if subin == target { print(0) } // ์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆ˜๋นˆ์ด์™€ ๋™์ƒ์˜ ์œ„์น˜๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ => ๋ฐ”๋กœ ๋
else {
    while true {
        let (now, now_count) = queue[index]
        index += 1
        var next = 0 // ์ˆ˜๋นˆ์ด๊ฐ€ ์ด๋™ํ•  ์œ„์น˜๋ฅผ ๋‹ด์„ ๋ณ€์ˆ˜

        for i in 0..<3 {
            if i == 0 { next = now - 1 } // X-1 ์ด๋™
            else if i == 1 { next = now + 1 } // X+1 ์ด๋™
            else { next = now * 2 } // X*2 ์ด๋™
            
            if next < 0 || next > 100000 || visited[next] == 1 { continue } // ์˜ˆ์™ธ!
            if next == target { found = true; break } // ์ฐพ์•˜์„ ๊ฒฝ์šฐ
            visited[next] = 1 // ์ˆ˜๋นˆ์ด๊ฐ€ ์ง€๋‚˜๊ฐ„ ๊ณณ์€ 1๋กœ ์ฒดํฌํ—ค์ฃผ๊ธฐ (๊ฐ™์€ ๊ณณ ๋˜ ์ง€๋‚˜๊ฐˆ ํ•„์š” ์ „ํ˜€x)
            queue.append((next, now_count + 1)) // ์ˆ˜๋นˆ์ด๊ฐ€ ์ด๋™ํ•  ์œ„์น˜์™€ ๊ทธ ์œ„์น˜๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„ ์ถ”๊ฐ€!
        }
        
        if found { print(now_count+1); break } // ๊ฒฐ๊ณผ ์ถœ๋ ฅ
    }
}

๐Ÿ‘‰ bfs๋ฌธ์ œ๋กœ, ์ˆ˜๋นˆ์ด๊ฐ€ ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•ด์ฃผ๋Š”๊ฒŒ ํฌ์ธํŠธ!

์ด๋™ํ•˜๋‹ค๋ณด๋ฉด ์ด๋ฏธ ํƒ์ƒ‰ํ–ˆ๋˜ ์ž๋ฆฌ๋ฅผ ์ค‘๋ณต ํƒ์ƒ‰ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ, ๊ทธ ์˜ˆ์™ธ๋ฅผ ์ž˜ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š”๊ฒƒ๋„ ์ค‘์š”ํ•˜๋‹ค.

  • ์ด ๋ฌธ์ œ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์˜ˆ์™ธ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ์ฒซ ๋ฒˆ์งธ๋กœ ๋ด์ค˜์•ผ ํ•  ์˜ˆ์™ธ๊ฐ€ ์žˆ๋‹ค.
    ์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆ˜๋นˆ์ด์™€ ๋™์ƒ์˜ ์œ„์น˜๊ฐ€ ๊ฐ™์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ๋•Œ๋Š” ๋ฐ”๋กœ 0์„ ์ถœ๋ ฅํ•˜๊ฒŒ ํ–ˆ๋‹ค.
  • ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” while์„ ์‚ฌ์šฉํ•ด ์ˆ˜๋นˆ์ด์˜ ์ด๋™๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ๊ฐ€์ฃผ์—ˆ๋Š”๋ฐ,
    ์ด ๋ฐ˜๋ณต๋ฌธ์—์„œ๋Š” ์ˆ˜๋นˆ์ด๊ฐ€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ ์„ธ ๊ฐ€์ง€ ๋ฐฉํ–ฅ์„ ๋ชจ๋‘ ์ฒดํฌํ•ด์ฃผ๊ณ 
    ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ผ๋ฉด queue์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ƒˆ๋กœ ํƒ์ƒ‰ํ•  ์‹œ์ž‘์ ์„ ๋”ํ•ด๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ–ˆ๋‹ค.
  • ์šฐ์„  queue์˜ ํ˜•ํƒœ๋ฅผ ๋จผ์ € ๋ณด๋ฉด, ํŠœํ”Œํ˜• ๋ฐฐ์—ด์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ •์˜ํ•œ ์ด์œ ๋Š”
    ์ด๋™ํ•˜๋Š” ์ˆ˜๋นˆ์ด์˜ ์œ„์น˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ทธ ์œ„์น˜๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„๊นŒ์ง€ ๊ฐ™์ด ๋‹ด์•„์ฃผ๊ธฐ ์œ„ํ•จ์ด๋‹ค.
  • while ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ๋Š” index ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตณ์ด queue์—์„œ popํ•˜์ง€ ์•Š๊ณ  ์ธ๋ฑ์Šค๋กœ ์ฐพ์•„์ฃผ์—ˆ๋‹ค.
    ์ˆ˜๋นˆ์ด๊ฐ€ ์ด๋™ํ•  ์œ„์น˜๋Š” next๋ผ๋Š” ๋ณ€์ˆ˜์— ๋‹ด์•„์ฃผ๋„๋ก ํ–ˆ๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  for๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ ๋”ฑ 3๋ฒˆ ๋ฐ˜๋ณตํ•จ์œผ๋กœ์จ ์ˆ˜๋นˆ์ด๊ฐ€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ์ฒดํฌํ–ˆ๋‹ค.
  • ์ฒดํฌํ•˜๋ฉด์„œ ์˜ˆ์™ธ ๋ฐ ์ˆ˜๋นˆ์ด๊ฐ€ ๋™์ƒ์„ ์ฐพ์•˜์„ ๊ฒฝ์šฐ๋ฅผ if๋ฌธ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ์—ˆ๋Š”๋ฐ,
    1) next ๋ณ€์ˆ˜๊ฐ€ 0 ๋ฏธ๋งŒ ํ˜น์€ 100000 ์ดˆ๊ณผ์ด๊ฑฐ๋‚˜, ๊ทธ ์ž๋ฆฌ๊ฐ€ ์ด๋ฏธ ์ฒดํฌํ–ˆ๋˜ ๊ณณ์ด๋ผ๋ฉด continueํ•ด์ฃผ์—ˆ๋‹ค.
    ์ด๋ฏธ ์ฒดํฌํ•œ ์ž๋ฆฌ์ธ์ง€๋ฅผ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” visited ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•ด์ฃผ์—ˆ๋‹ค.
    ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๋ฒ”์œ„๋งŒํผ์˜ ํฌ๊ธฐ๋กœ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์—ฌ ์ง€๋‚˜๊ฐ„ ์ž๋ฆฌ๋Š” 1์„ ์ €์žฅํ–ˆ๋‹ค.
    2) next ๋ณ€์ˆ˜๊ฐ€ ๋™์ƒ์˜ ์œ„์น˜ target๊ณผ ๊ฐ™๋‹ค๋ฉด found ๋ณ€์ˆ˜๋ฅผ false๋กœ ๋ฐ”๊พธ๊ณ  for ๋ฐ˜๋ณต์„ ์ข…๋ฃŒํ•˜๊ฒŒํ–ˆ๋‹ค.
    for๋ฌธ์ด ๋๋‚˜๋ฉด while๋ฌธ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— found๊ฐ€ true์ผ ๋•Œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  while๋ฐ˜๋ณต์„ ์ข…๋ฃŒํ•˜๊ฒŒ ํ–ˆ๋‹ค.
  • ์œ„์˜ ๋‘ ๊ฐ€์ง€ ์‚ฌํ•ญ์— ํ•ด๋‹นํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ visited๋ฐฐ์—ด์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ ,
    queue์— (์ˆ˜๋นˆ์ด์˜ ๋‹ค์Œ ์œ„์น˜, ๊ทธ ์œ„์น˜๊นŒ์ง€ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„)์„ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ์˜ˆ์™ธ๋งŒ ์ž˜ ์ƒ๊ฐํ•ด์ฃผ๋ฉด ์–ด๋ ต์ง€ ์•Š์€ ๋ฌธ์ œ์˜€๋‹ค.
    1) ์ˆ˜๋นˆ์ด์™€ ๋™์ƒ์˜ ์œ„์น˜๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐ™์„ ๊ฒฝ์šฐ
    2) ์ˆ˜๋นˆ์ด๊ฐ€ ์ด๋™ํ•  ๋‹ค์Œ ๊ฒฝ๋กœ๊ฐ€ 0๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ 100000๋ณด๋‹ค ํด ๊ฒฝ์šฐ
    3) ์ˆ˜๋นˆ์ด๊ฐ€ ์ด๋™ํ•  ๋‹ค์Œ ๊ฒฝ๋กœ๊ฐ€ ์ด๋ฏธ ์ฒดํฌํ•ด์คฌ๋˜ ์ž๋ฆฌ์ผ ๊ฒฝ์šฐ

 


๋ฌธ์ œ

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

๋Œ“๊ธ€