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

Algorithm/Baekjoon

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] (Swift) ๋‹จ์–ด๋ณ€ํ™˜ (LV.3) (DFS)

๊ฐ์ž ๐Ÿฅ” 2023. 3. 3. 17:04
๋ฐ˜์‘ํ˜•

โšซ๏ธ ๋ฌธ์ œ

https://school.programmers.co.kr/learn/courses/30/lessons/43163?language=swift 

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

โšซ๏ธ ๋‚˜์˜ ์ƒ๊ฐ์˜ ํ๋ฆ„

์ผ๋‹จ ๋ช‡๋‹จ๊ณ„์˜ ํ๋ฆ„์„ ๊ฑฐ์ณ์•ผํ•˜๋Š”์ง€ , ๊ทธ๋ฆฌ๊ณ  ์ด ํ๋ฆ„์ด ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ํ•ด๋ฅผ ๊ตฌํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋‹จ ๊ฐ€์žฅ ๋จผ์ € BFS๋ฅผ ๋– ์˜ฌ๋ ธ๋‹ค. ๊ทธ๋Ÿผ BFS๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ์ด๊ฒƒ์ €๊ฒƒ ์ƒ๊ฐ์„ ํ•ด๋ณด์ž.

๐Ÿ”– ์‹œ๊ฐ„๋ณต์žก๋„

์กฐ๊ฑด์„ ์‚ดํŽด๋ณด๊ณ  ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ƒ๊ฐํ•ด๋ดค๋‹ค. BFS๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์ด N๋ฒˆ์˜ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜๊ณ , queue๊ฐ€ ๋นŒ๋•Œ๊นŒ์ง€ while๋ฌธ์ด ๋ฐ˜๋ณต๋˜๋ฏ€๋กœ O(n^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ž์—์„œ ํ•ญ์ƒ ๋งํ–ˆ๋“ฏ, BFS๋Š” queue์˜ ์„ฑ๋Šฅ์ด ๊ต‰์žฅํžˆ ์ค‘์š”ํ•œ๋ฐ, ๊ฐ€์žฅ ์ข‹์€ ๊ฑด O(1)์งœ๋ฆฌ ํ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด์ง€๋งŒ, ๋ฒ”์œ„๊ฐ€ ํ•ด๋ณผ๋งŒํ•˜๋‹ค๋ฉด, ๊ณผ๊ฐํ•˜๊ฒŒ removeFirst๋ฅผ ์จ๋„ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์ง€๊ธˆ ์ด ๊ฒฝ์šฐ๋Š” queue ๋‚ด๋ถ€์— ๊ฐ€์žฅ ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋„ 2500๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ญ.. ๋‚˜์˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. (์•„์ง์€ ์ด์ •๋„๋กœ ์ถ”์ธกํ•˜๋Š” ์ •๋„์ด์ง€๋งŒ, ์กฐ๋งŒ๊ฐ„ ๋” ์ž์„ธํžˆ ์‹œ๊ฐ„๋ณต์žก๋„์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ณ  ๊ธ€์„ ํฌ์ŠคํŒ…ํ•ด๋ณด๊ฒ ๋‹ค! ๐Ÿ‘Š๐Ÿป)

๐Ÿ”– ๊ทธ๋Ÿผ , BFS๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ๋กœ ํ•˜๊ณ  ์ˆ˜๋„์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด๋ณด์ž.

์ผ๋‹จ BFS๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋…ธ๋“œ๊นŒ์ง€ ๋„๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด, ๋ฐ”๋กœ while๋ฌธ์„ ํƒˆ์ถœํ•˜๊ณ  ๊ทธ ๋…ธ๋“œ๊นŒ์ง€ ๊ฐ„ cost ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ด ๋ฐฉ์‹์„ ์ด์šฉํ•˜๊ณ ์ž ํ–ˆ๋‹ค. ๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ ๋ญ๊ฐ€ ๋…ธ๋“œ๊ฐ€ ๋ ๊นŒ?

๋ฌธ์ œ์˜ ์กฐ๊ฑด์ด, hit begin์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค๋ฉด 'ํ•œ ์•ŒํŒŒ๋ฒณ'์ด ๋‹ค๋ฅธ ๊ฒƒ์ด ๋‹ค์Œ์œผ๋กœ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์–˜์žฌ 1๋ฒˆ์„ ์˜ˆ์‹œ๋กœ ๋ณด๋ฉด, hit ๋‹ค์Œ์œผ๋กœ๋Š” hot์ด ์˜ฌ ์ˆ˜ ์žˆ๊ฒ ์ง€? ๊ทธ๋Ÿฌ hit๊ณผ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ hot์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  hot์„ ๋‹ค์Œ ํ์— ๋„ฃ์–ด์ค€๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ DFS๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?

๋ฌธ์ œ์˜ ์กฐ๊ฑด์—์„œ 'ํ•œ ๊ธ€์ž๋งŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค'๋ผ๊ณ  ํ•œ ๊ฒƒ์€, ๊ฒฐ๊ตญ ํ•œ๊ธ€์ž ๋นผ๊ณ  ์•ŒํŒŒ๋ฒณ์˜ ์œ„์น˜๋Š” ๋ชจ๋‘ ๊ฐ™์•„์•ผํ•œ๋‹ค. hit ๊ณผ hot์ฒ˜๋Ÿผ! ๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ ํ•œ๊ธ€์ž๋งŒ ๋‹ค๋ฅธ ๊ฒƒ์„ ๊ตฌ๋ณ„ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. (๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋…ธ๋ ฅํ•ด๋ดค๋‹ค ^___^ ๐Ÿ‘Š๐Ÿป)

์ด ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ zip์„ ์ฒ˜์Œ ์จ๋ดค๋Š”๋ฐ, hit๊ณผ hot์„ zip์„ ์ด์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, h-h, i-o, t-t ์ด๋ ‡๊ฒŒ ์ง์ง€์–ด์„œ loop๋ฅผ ๋Œ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๋ณดํ†ต for๋ฌธ์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค! ์–ด์จŒ๋“  ์ด zip์„ ์ด์šฉํ•˜๊ณ , filter๋กœ ๋น„๊ตํ•ด์ฃผ์—ˆ๋‹ค.

func canChange(word: String, changeWord: String) -> Bool {
    if zip(word, changeWord).filter({ $0 != $1 }).count == 1 {
        return true
    }
    return false
}

 

โšซ๏ธ ์ •๋‹ต์ฝ”๋“œ

import Foundation

func solution(_ begin:String, _ target:String, _ words:[String]) -> Int {
    if !words.contains(target) {
        return 0
    }

    // bfs
    var queue = [(String, Int)]()
    queue.append((begin, 0))

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

        for w in words {
            if canChange(word: word, changeWord: w) {
                if w == target {
                    return depth + 1
                } else {
                    queue.append((w, depth + 1))
                }
            }
        }
    }

    return 0
}

func canChange(word: String, changeWord: String) -> Bool {
    if zip(word, changeWord).filter({ $0 != $1 }).count == 1 {
        return true
    }
    return false
}
๋ฐ˜์‘ํ˜•