Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 1697๋ฒˆ - ์ˆจ๋ฐ”๊ผญ์งˆ (์‹ค๋ฒ„1, ๋‘๊ฐ€์ง€ ํ’€์ด BFS, DP)

๊ฐ์ž ๐Ÿฅ” 2023. 4. 22. 21:55
๋ฐ˜์‘ํ˜•

์˜ค๋žœ๋งŒ์— ํฌ์ŠคํŒ…ํ•˜๋„ค์šฉ,
์ด๋Ÿฐ์ €๋Ÿฐ ์ฑ„์šฉ์ค€๋น„๋•Œ๋ฌธ์— ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž˜ ๋ชปํ’€์—ˆ๋˜๊ฒƒ๋„ ์‚ฌ์‹ค์ด์ง€๋งŒ, ๊ทธ๋™์•ˆ ํ‘ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋“ค์€ ๋Œ€๋ถ€๋ถ„ ํŒŒ์ด์ฌ์œผ๋กœ ํ’€๊ธฐ๋„ ํ–ˆ์—ˆ๊ณ  ๊นƒํ—ˆ๋ธŒ์—๋งŒ ๋‚จ๊ธฐ๊ณ ... ์ด๋Ÿฐ์ €๋Ÿฐ ์ด์œ ๋กœ ํ•ด์„œ ... ์—…๋กœ๋“œ ํ•˜์ง€ ์•Š์•˜์—ˆ๋„ค์š”! ํ•˜ํ•˜ํ•˜ํ•˜ํ•˜  ๋‹ค์‹œ ํ™”์ดํŒ….. ! ๐Ÿ€

 

โšซ๏ธ ๋ฌธ์ œ

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

 

1697๋ฒˆ: ์ˆจ๋ฐ”๊ผญ์งˆ

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

www.acmicpc.net

 

โšซ๏ธ ๋‚˜์˜ ํ’€์ด (๋‘๋ฒˆ์งธ ํ‘ธ๋Š” ๊ฒƒ์ด๊ธด ํ•จ!)

๋ฌธ์ œ๋ฅผ ๋ณด์ž๋งˆ์ž ์ƒ๊ฐ๋‚œ BFSํ’€์ด๋ฐฉ์‹์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ , ๋ฌธ์ œ๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ƒ๊ฐํ•ด๋ณด๋ฉด์„œ, "์–ด ์ด๊ฑฐ dp๋กœ๋„ ํ’€ ์ˆ˜ ์žˆ๊ฒ ๋Š”๋ฐ?" ํ•˜๋Š” ์ƒ๊ฐ์ด ๋™์‹œ์— ๋“ค์—ˆ๊ณ , ํ’€์ด๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ๊นŒ dp๋กœ ํ‘ผ ์‚ฌ๋žŒ๋„ ์กด์žฌํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ๋‘๊ฐ€์ง€ ๋ชจ๋‘ ํ’€์ด๋ฅผ ํ•ด๋ณด๊ธฐ๋กœ ๊ฒฐ์ •! 

์‹ค๋ ฅ์ด ๋Š˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ์†์ƒํ–ˆ๋Š”๋ฐ, ์˜ˆ์ „์—๋Š” ์‹ค๋ฒ„1๋„ ๋ฒ…์ฐผ์ง€๋งŒ ์š”์ฆ˜์—๋Š” ๊ทธ๋ž˜๋„ ์‹ค๋ฒ„1์€ ์ž์‹ ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์ˆ™์ˆ™ ํ’€์–ด๋‚˜๊ฐ„๋‹ค. ๊ณจ๋“œ 3๊นŒ์ง€ ํ’€ ์ˆ˜ ์žˆ์„์ •๋„๋กœ ๋…ธ๋ ฅํ•ด๋ณด์ž! 

1๏ธโƒฃ ์ฒซ๋ฒˆ์งธ ํ’€์ด, BFS๋กœ ํ’€๊ธฐ

์•„์ดํŒจ๋“œ๊ฐ€ ์—†์–ด์„œ ํŽœ์œผ๋กœ ๊ทธ๋ฆฐ๊ฑฐ.. ์Šค์บ”,,,,

bfs๋Š” ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๋ฉด์„œ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆผ์œผ๋กœ ๊ทธ๋ฆฐ๊ฒƒ์ฒ˜๋Ÿผ, ๋ฐฑ์ค€์˜ ์ฒซ๋ฒˆ์งธ ์ˆ˜๋นˆ์ด์˜ ์œ„์น˜์ธ 5๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜๋ฉด, ๊ทธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์€ 5์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋“ค์ด ํ•ด๋‹นํ•  ๊ฒƒ์ด๋‹ค. ์ฐจ๊ทผ์ฐจ๊ทผ ํ™”์‚ดํ‘œ๋ฅผ ๊ทธ๋ฆฌ๋ฉด์„œ ์ˆ˜๋นˆ์ด์˜ ์œ„์น˜๋ฅผ ํ์— ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์„ ์ƒ์ƒํ–ˆ๋‹ค. ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๊ทธ๋ฆฌ์ง„ ์•Š์•˜์ง€๋งŒ, ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋™์ƒ์˜ ์œ„์น˜์ธ 17์— ๋„๋‹ฌํ•  ๋•Œ, bfs๋ฅผ ํƒˆ์ถœํ•˜๊ฒŒ ํ•ด์ฃผ๊ณ , ๊ทธ๋•Œ์˜ depth๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ๊ทธ๊ฒŒ ๋ฐ”๋กœ 5 -> 10 -> 9 -> 18 -> 17 ํ•ด์„œ 4๊ฐ€ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

์ด๊ฒƒ์„ ๊ทธ๋Œ€๋กœ bfs๋กœ ๊ตฌํ˜„ํ–ˆ๋˜ 1์ฐจ์‹œ๋„,, ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

func bfs() {
    let nk = readLine()!.split(separator: " ").map{ Int($0)! }
    var queue = [(nk[0], 0)] // ์ˆ˜๋นˆ์ด์˜ ์ฒซ ์œ„์น˜๊ฐ€ ์‹œ์ž‘์ , depth ๋Š” 0

    while !queue.isEmpty {
        let temp = queue.removeFirst()
        let place = temp.0
        let depth = temp.1

        if place == nk[1] { // k์œ„์น˜๋ฉด?
            print("\(depth)")
            break
        }

        if place - 1 >= 0 {
            queue.append((place - 1, depth + 1))
        }
        queue.append((place + 1, depth + 1))
        queue.append((place * 2, depth + 1))
    }
}

bfs()

์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค. ์™œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ์„๊นŒ? ์ƒ๊ฐํ–ˆ๋‹ค. while๋ฌธ์„ ๋Œ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—, queue์˜ ๊ธธ์ด์— ๋‹ค๋ผ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋‹ฌ๋ผ์ง„๋‹ค. ๊ทธ๋ž˜์„œ ํ์˜ ๊ธธ์ด์ธ N์ด ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋˜์–ด O(N)์ด ๋œ๋‹ค. ํ•˜์ง€๋งŒ,,, ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œ removeFirst()๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. removeFirst()์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N),, ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ตœ์ข…์ ์œผ๋กœ O(N^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๊ฒŒ๋œ๋‹ค. 

(๊ทธ๋ ‡๋‹ค. ์šฐ๋ฆฌ๋Š” Swift๋กœ bfs๋ฅผ ๊ตฌํ˜„ํ• ๋•Œ, ์•„์ฃผ ์ข‹์€ ์„ฑ๋Šฅ์˜ ํ (ํŒŒ์ด์ฌ์˜ deque๊ฐ€ ์—†๋‹ค๋ฉด, ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•ด์•ผํ•œ๋‹ค๊ณ  ์•ž์„œ ์–ธ๊ธ‰ํ•œ ์  ์žˆ๋‹ค. https://didu-story.tistory.com/422)

์šฐ๋ฆฌ๋Š” N๊ณผ K์˜ ์ตœ๋Œ€๊ฐ’์€ 10๋งŒ์ด๊ณ , ๊ฐ 10๋งŒ๊ฐœ์˜ ์• ๋“ค์ด 3๊ฐœ์”ฉ์˜ ์ธ์ ‘๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ํ์— ๋“ค์–ด๊ฐ„๋‹ค์น˜๋ฉด... ๊ทธ๋ฆฌ๊ณ  ๊ฑฐ๊ธฐ์„œ ๋˜ O(N)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋Š” removeFirst()๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ๋‹น์—ฐ์Šค๋Ÿฝ๊ฒŒ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ๊ฒƒ์ด๋‹ค. removeFirst()๋ฅผ ์—†์• ๊ณ , ์‹œ๊ฐ„๋ณต์žก๋„ O(1)์„ ๊ฐ–๋Š”, index๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์—ฌ์ฃผ์–ด์•ผํ•œ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ์ž‘์„ฑํ•œ 2์ฐจ์‹œ๋„,,,, ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹ค ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹

func bfs() {
    let nk = readLine()!.split(separator: " ").map{ Int($0)! }
    var queue = [(nk[0], 0)] // ์ˆ˜๋นˆ์ด์˜ ์ฒซ ์œ„์น˜๊ฐ€ ์‹œ์ž‘์ , depth ๋Š” 0
    var idx = 0

    while idx <= queue.count {
        let temp = queue[idx]
        let place = temp.0
        let depth = temp.1

        if place == nk[1] { // k์œ„์น˜๋ฉด?
            print("\(depth)")
            break
        }

        if place - 1 >= 0 {
            queue.append((place - 1, depth + 1))
        }
        queue.append((place + 1, depth + 1))
        queue.append((place * 2, depth + 1))
        idx += 1
    }
}

bfs()

ใ…‹ใ…‹ใ…‹ใ…‹ ์•„์˜ค ๋ฉ”๋ชจ๋ฆฌ์ดˆ๊ณผ... queue์— ์‚ฝ์ž…๋˜๋Š” ์•„์ด๋“ค์ด ๋„ˆ๋ฌด ๊ธธ์–ด์ ธ์„œ ๊ทธ๋Ÿฐ๊ฐ€? ๋ง๊ทธ๋Œ€๋กœ 10๋งŒ๊ฐœ์˜ ์•„์ด๋“ค์—๊ฒŒ 3๊ฐœ์”ฉ์˜ ์ธ์ ‘๋…ธ๋“œ๊ฐ€ ์žˆ์„ ํ…Œ๋‹ˆ๊นŒ... ๊ทธ๋ž˜์„œ queue๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๊ธฐ๋กœ ํ•œ๋‹ค. 

(์ˆ˜๋นˆ์˜ ์œ„์น˜, depth) ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑ๋จ.. ์—ฌ๊ธฐ ๋นจ๊ฐ„์ค„ ์นœ๊ฒƒ๋งŒ ๋ณด๋ฉด, 13์„ ๋ฒŒ์จ ์„ธ๋ฒˆ์ด๋‚˜ ๋ฐฉ๋ฌธํ•œ๋‹ค. ์‹ฌ์ง€์–ด ์ด๊ฒƒ์€ ํ๋ฅผ ๋ชจ๋‘ ์‚ฝ์ž…ํ•˜์ง€ ์•Š๊ณ , ์ค‘๊ฐ„์— ์•„๋ฌด๊ฑฐ๋‚˜ ์บก์ณํ•œ๊ฑด๋ฐ ๋ฒŒ์จ ์„ธ๊ฐœ๋‚˜ ๋ณด์ธ๋‹ค. ์„ธ๊ฐœ๋ณด๋‹ค ๋” ๋งŽ์ด ๋“ค์–ด์žˆ์„ ๊ฒƒ์ด๋‹ค.

์šฐ๋ฆฌ๋Š” '์ตœ๋‹จ๊ฑฐ๋ฆฌ'๋ฅผ ์ฐพ์•„์•ผํ•œ๋‹ค. ์ˆ˜๋นˆ์ด๊ฐ€ 13์œ„์น˜์— ๋„๋‹ฌํ•˜๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋Š”, ๋ฌด์กฐ๊ฑด 3์ด๋‹ค. ๊ทธ ์ด์ƒ์ด ๋˜์–ด๋„ ํ์— ๋„ฃ์–ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค. ์šฐ๋ฆฌ๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋งŒ ๊ตฌํ•ด์ฃผ๋ฉด ๋˜๋‹ˆ๊นŒ... ๊ทธ๋‹ˆ๊นŒ ์ง€๊ธˆ ํ์— ๋„ˆ๋ฌด ์“ธ๋ฐ์—†๋Š” ๊ฒƒ๋“ค์ด ๋งŽ์ด ๋“ค์–ด์žˆ๊ณ , ์–˜๋„ค๋“ค์„ ํ•˜๋‚˜์”ฉ ์ „๋ถ€ ์ ‘๊ทผํ•˜๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ์ดˆ๊ณผ๊ฐ€ ๋‚˜๋Š”๊ฒŒ ์•„๋‹๊นŒ? ์ƒ๊ฐํ•ด๋ณธ๋‹ค. ๊ทธ๋Ÿผ ์ด ๋ชจ๋“ ๊ฒƒ๋“ค์„ visited๋ผ๋Š” ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ํ์— ๋„ฃ์–ด์ฃผ์ง€ ์•Š๋Š” ์ž‘์—…์„ ํ•ด๋ณด์ž.

โœ… BFS๋กœ ํ‘ผ ์ •๋‹ต์ฝ”๋“œ

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ๋Œ€๋กœ, ์ค‘๋ณต์„ ์ค„์—ฌ์ฃผ๋Š” visited ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋‹ˆ๊นŒ, ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

import Foundation

func bfs() {
    let nk = readLine()!.split(separator: " ").map{ Int($0)! }
    var queue = [(nk[0], 0)] // ์ˆ˜๋นˆ์ด์˜ ์ฒซ ์œ„์น˜๊ฐ€ ์‹œ์ž‘์ , depth ๋Š” 0
    var visited = Array(repeating: false, count: 100001)
    visited[nk[0]] = true
    var idx = 0

    while idx <= queue.count {
        let temp = queue[idx]
        let place = temp.0
        let depth = temp.1

        if place == nk[1] { // k์œ„์น˜๋ฉด?
            print("\(depth)")
            break
        }

        for i in 0..<3 {
            var nextPlace = 0

            switch i {
            case 0:
                nextPlace = place - 1
            case 1:
                nextPlace = place + 1
            default:
                nextPlace = place * 2
            }

            if nextPlace >= 0, nextPlace <= 100000, !visited[nextPlace] {
                visited[nextPlace] = true
                queue.append((nextPlace, depth + 1))
            }
        }

        idx += 1
    }
}

bfs()

 

2๏ธโƒฃ ๋‘๋ฒˆ์งธ ํ’€์ด, DP๋กœ ํ’€๊ธฐ

๋ญ”๊ฐ€, dp๋กœ ํ’€ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜๋‹ค. ์•ž์—์„œ ๋งํ–ˆ๋“ฏ, ์ˆ˜๋นˆ์ด๊ฐ€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” place (์œ„์น˜)์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” '์ตœ๋‹จ๊ฑฐ๋ฆฌ'๋งŒ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” 5๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ์œผ๋ฏ€๋กœ, dp[5]์—๋Š” 5๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ 0์„ ์ผ๋‹จ ๋„ฃ์–ด์ค€๋‹ค. ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ ์ƒ๊ฐํ•ด๋ณด์ž.

1. 2*x์ผ๊ฒฝ์šฐ๋Š” dp[์ง์ˆ˜]์ผ ๊ฒฝ์šฐ์ด๋‹ค. ์ฆ‰, dp ๋‚ด๋ถ€์—์„œ๋Š” ์ง์ˆ˜์ผ๊ฒฝ์šฐ์™€ ํ™€์ˆ˜์ผ๊ฒฝ์šฐ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋ˆ ์„œ ์ƒ๊ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

2. ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” i๊ฐ€ ์ง์ˆ˜์ผ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž. ๋งŒ์•ฝ 5์—์„œ 12๊นŒ์ง€ ์ด๋™ํ•œ๋‹ค๋ฉด?  dp[i]๊นŒ์ง€ ๊ฐ€๋Š” ๋ฐฉ์‹์€ ์•„๋ž˜ ์—ฐ๋‘์ƒ‰๊ณผ ํ•˜๋Š˜์ƒ‰ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. 11์—์„œ ์˜ค๊ฑฐ๋‚˜, 6์—์„œ์˜ค๊ฑฐ๋‚˜!! ๋‘˜์ค‘ํ•˜๋‚˜๊ฐ€ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์œผ๋ฏ€๋กœ, ๋ฌด์กฐ๊ฑด ์ง์ˆ˜์—์„œ ์˜ค๋Š”๊ฒŒ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์•„๋‹ˆ์•ผ? ์‹ถ์„ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ๋ฒ”์œ„ 10๋งŒ์„ ๋‹ค๋ฃฐ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ์ค‘ ์ž‘์€ ๊ฒƒ์„ ๋„ฃ์–ด์ฃผ์ž.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— i ๊ฐ€ ์ง์ˆ˜์ผ ๊ฒฝ์šฐ์—, dp[i] = dp[i/2] + 1 ์ด๊ฑฐ๋‚˜ ํ•œ ์นธ ์ „ (11)์—์„œ ์˜จ ๊ฒฝ์šฐ๊ฐ€ ์ตœ์†Œ์ผ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ๋‘๊ฐœ๋ฅผ ๋น„๊ตํ•ด์„œ ๋„ฃ์–ด์ฃผ์ž.

 

3. i๊ฐ€ ํ™€์ˆ˜์ผ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž. ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ๋Š” ์„ธ๊ฐœ์˜ ์„ ์„ ๊ทธ๋ ค๋†“์•˜์ง€๋งŒ, ์–ด์ฐŒ๋๋“  ์š”์•ฝํ•ด๋ณด๋ฉด 13๊นŒ์ง€ ์˜ค๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 12์—์„œ ์˜ค๊ฑฐ๋‚˜, 14์—์„œ ์˜ค๊ฑฐ๋‚˜ ๋‘˜์ค‘ ํ•˜๋‚˜์ด๋‹ค. ํ•˜์ง€๋งŒ 12์™€ 14๋Š” ๋ชจ๋‘ ์ง์ˆ˜์ด๊ธฐ์—, 12/2 ๋‚˜, 14/2์—์„œ ์˜จ ๊ฐ’๋“ค๋กœ ์ฑ„์›Œ์ ธ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ ๊ทธ๊ฒƒ๋“ค์—์„œ +1 ํ•ด์ค€ ๊ฐ’์ด ํ™€์ˆ˜๊นŒ์ง€ ์˜ค๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๋œ๋‹ค.

๊ทธ๋ฆผ์—๋„ ์“ฐ์—ฌ์ ธ ์žˆ์ง€๋งŒ, ์ฃผ์˜ํ• ์ ์ด ์žˆ๋‹ค. dp๋Š” ์•ž์—์„œ๋ถ€ํ„ฐ ์ฑ„์›Œ๋‚˜๊ฐ€๋‹ˆ๊นŒ, dp[13]์„ ์ฑ„์šธ ๋•Œ, dp[14]๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. (์•„๋‹ˆ๋ฉด ์ฒ˜์Œ ์ดˆ๊ธฐํ™”๋œ temp๊ฐ’ ์•„๋ฌด๊ฑฐ๋‚˜๋กœ ์ฑ„์›Œ์ ธ์žˆ์„ ๊ฒƒ์ด๋‹ค.) ์ด๊ฒƒ์œผ๋กœ ๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ค„ ์ˆ˜ ์—†์œผ๋‹ˆ, dp[14]์— ์˜ค๊ฒŒ ๋  ๊ฐ’ dp[7]์˜ ๊ฐ’์—์„œ +1 ํ•ด์ค€ ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.

4. ๊ทธ๋ฆฌ๊ณ  ์ฃผ์–ด์ง„ ์ˆ˜๋นˆ์ด์˜ ์œ„์น˜๋ณด๋‹ค ์•ž์—์žˆ๋Š” ์• ๋“ค์€ ์ „๋ถ€ -1์”ฉ ๋„ฃ์–ด์ค€๋‹ค. ์˜ˆ์‹œ๋กœ๋ณด๋ฉด 5๋ถ€ํ„ฐ ์‹œ์ž‘์ด๊ณ , dp[4]๋Š” 5-4์ธ 1์ด ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๊ณ , dp[3]์€ 2, dp[2]๋Š” 3... ์ด๋ ‡๊ฒŒ ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๋‹ค. (์•ž์œผ๋กœ ๊ฐ€๋Š” ๋ฐฉ๋ฒ•์€ ํ•œ์นธ์”ฉ ์›€์ง์ด๋Š” ๋ฐฉ๋ฒ•๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ!
๊ทธ๋ ‡๋‹ค๋ฉด, dp๋ฅผ ๋จผ์ € ์ฑ„์›Œ์ฃผ๊ณ  ์‹œ์ž‘ํ•ด์•ผ๊ฒ ์ง€?

์ด ๋ชจ๋“  ๊ฒƒ๋“ค์„ ๊ตฌํ˜„ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ๋Œ๋ ธ๋Š”๋ฐ, 1์ฐจ์‹œ๊ธฐ ์ „๋ถ€ ํ‹€๋ ธ๋‹ค.

import Foundation

func dp() -> Int {
    let nk = readLine()!.split(separator: " ").map{ Int($0)! }
    var dp = Array(repeating: 100001, count: 100001) // ์ตœ๋Œ€๊ฐ’์•„๋ฌด๊ฑฐ๋‚˜๋กœ ์ฑ„์›Œ์คŒ

    if nk[0] >= nk[1] {
        return nk[0] - nk[1]
    }

    for i in 0..<nk[0] {
        dp[i] = nk[0] - i
    }

    for i in nk[0]+1...nk[1] {
        if i % 2 == 0 {
            // ์ง์ˆ˜์ด๋ฉด
            dp[i] = min(dp[i/2] + 1, dp[i-1] + 1)
        } else {
            // ํ™€์ˆ˜์ด๋ฉด
            dp[i] = min(dp[i-1] + 1, dp[(i+1)/2] + 2)
        }
    }

    return dp[nk[1]]
}

print(dp())

์ง„์งœ ๋ญ๊ฐ€ ํ‹€๋ฆฐ๊ฑฐ์•ผ ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ 

๊ณ ๋ฏผ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ์œ ์‹ฌํžˆ ๋ฒ”์œ„๋ฅผ ์‚ดํˆ๋‹ค. ์ง€๊ธˆ.... n๊ณผ k๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ์ง€ ์•Š์•˜๋‹ค. ๊ฐ™์€๊ฒฝ์šฐ์—๋Š” dp์— 0์„ ๋„ฃ์–ด์ฃผ์–ด์•ผํ•œ๋‹ค. ์ด๊ฑฐ์ฐพ๋Š๋ฐ๋งŒ ๋ช‡๋ถ„์ด ๊ฑธ๋ฆฐ๊ฑฐ์•ผ ใ… ใ… ใ…  

โœ… ๊ทธ๋ž˜์„œ ๋งž์ถ˜ ์ตœ์ข…์ฝ”๋“œ!

import Foundation

func dp() -> Int {
    let nk = readLine()!.split(separator: " ").map{ Int($0)! }
    var dp = Array(repeating: 100001, count: 100001) // ์ตœ๋Œ€๊ฐ’์•„๋ฌด๊ฑฐ๋‚˜๋กœ ์ฑ„์›Œ์คŒ

    if nk[0] >= nk[1] {
        return nk[0] - nk[1]
    }

    for i in 0..<nk[0] {
        dp[i] = nk[0] - i
    }
    
    dp[nk[0]] = 0

    for i in nk[0]+1...nk[1] {
        if i % 2 == 0 {
            // ์ง์ˆ˜์ด๋ฉด
            dp[i] = min(dp[i/2] + 1, dp[i-1] + 1)
        } else {
            // ํ™€์ˆ˜์ด๋ฉด
            dp[i] = min(dp[i-1] + 1, dp[(i+1)/2] + 2)
        }
    }

    return dp[nk[1]]
}

print(dp())

 

์•„์˜ค .. ๋“œ๋””์–ด ๋งž์•˜๋‹ค.

์‚ฌ์†Œํ•œ ๋ฒ”์œ„์‹ค์ˆ˜, ๊ทธ๋ฆฌ๊ณ  'n๊ณผ k๊ฐ€ ๊ฐ™์„๊ฒฝ์šฐ', ๊ทธ๋ฆฌ๊ณ  'n์ด k๋ณด๋‹ค ํด ๊ฒฝ์šฐ'๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ์ง€ ์•Š์•„์„œ ํ’€์ด๋ฐฉ๋ฒ•์€ ์ „๋ถ€ ๋‹ค ์ƒ๊ฐํ•ด๋†“์•˜์ง€๋งŒ,,,,, ์ด๋Ÿฐ๊ฒƒ๋“ค๋•Œ๋ฌธ์— ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค ใ… ใ…  ํ•˜.... ์ด๋Ÿฐ ์ž”์‹ค์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ ๋…ธ๋ ฅํ•ด์•ผ๊ฒ ๋‹ค.... ๊ฒฐ๊ตญ dp๋„ ๊ทธ๋ž˜์„œ ๋ญ˜ ๋†“์ณค๋Š”์ง€ ์ฐพ์•„๋ณด๊ธฐ ์œ„ํ•ด์„œ ๋‹ค๋ฅธ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค ใ… ใ… ใ… ใ… ใ…  ์•„ ์ง„์งœ!! ์ œ๋ฐœ ์ž”์‹ค์ˆ˜ํ•˜์ง€๋ง๊ณ  ์ •์‹  ๋˜‘๋ฐ”๋กœ ์ฐจ๋ฆฌ๊ณ  ํ•ด์•ผ๊ฒŸ๋‹ค!

๋ฐ˜์‘ํ˜•