๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป DEV/ใ„ด problems

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊นŠ์ด/๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(DFS/BFS) : ๋‹จ์–ด ๋ณ€ํ™˜

by vodkassi 2021. 9. 27.
728x90

๐Ÿ“ ๋ฌธ์ œ ์„ค๋ช…

 

๋‘ ๊ฐœ์˜ ๋‹จ์–ด begin, target๊ณผ ๋‹จ์–ด์˜ ์ง‘ํ•ฉ words๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทœ์น™์„ ์ด์šฉํ•˜์—ฌ begin์—์„œ target์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ€์žฅ ์งง์€ ๋ณ€ํ™˜ ๊ณผ์ •์„ ์ฐพ์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

1. ํ•œ ๋ฒˆ์— ํ•œ ๊ฐœ์˜ ์•ŒํŒŒ๋ฒณ๋งŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2. words์— ์žˆ๋Š” ๋‹จ์–ด๋กœ๋งŒ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด begin์ด "hit", target๊ฐ€ "cog", words๊ฐ€ ["hot","dot","dog","lot","log","cog"] ๋ผ๋ฉด
"hit" -> "hot" -> "dot" -> "dog" -> "cog"์™€ ๊ฐ™์ด 4๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‘ ๊ฐœ์˜ ๋‹จ์–ด begin, target๊ณผ ๋‹จ์–ด์˜ ์ง‘ํ•ฉ words๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์ตœ์†Œ ๋ช‡ ๋‹จ๊ณ„์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ begin์„ target์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

 

 

๐Ÿ“ ์ œํ•œ ์‚ฌํ•ญ

 

- ๊ฐ ๋‹จ์–ด๋Š” ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

- ๊ฐ ๋‹จ์–ด์˜ ๊ธธ์ด๋Š” 3 ์ด์ƒ 10 ์ดํ•˜์ด๋ฉฐ ๋ชจ๋“  ๋‹จ์–ด์˜ ๊ธธ์ด๋Š” ๊ฐ™์Šต๋‹ˆ๋‹ค.

- words์—๋Š” 3๊ฐœ ์ด์ƒ 50๊ฐœ ์ดํ•˜์˜ ๋‹จ์–ด๊ฐ€ ์žˆ์œผ๋ฉฐ ์ค‘๋ณต๋˜๋Š” ๋‹จ์–ด๋Š” ์—†์Šต๋‹ˆ๋‹ค.

- begin๊ณผ target์€ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

- ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” 0๋ฅผ return ํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“ ์ž…์ถœ๋ ฅ ์˜ˆ

 

begin target words return
"hit" "cog" ["hot", "dot", "dog", "lot", "log", "cog"] 4
"hit" "cog" ["hot", "dot", "dog", "lot", "log"] 0

 


๐Ÿ“ ์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…


์˜ˆ์ œ #1: ๋ฌธ์ œ์— ๋‚˜์˜จ ์˜ˆ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ #2: target์ธ "cog"๋Š” words ์•ˆ์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ“ ๋‚˜์˜ ์†”๋ฃจ์…˜

 

function changeOneLetter(word1, word2) {
    let count = 0;
    for (let i=0; i<word1.length; i++){
        if (word1[i] !== word2[i]){
            count++;
        }
    } 
    return count === 1;  
}

function solution(begin, target, words) {
    
    if (!words.includes(target)){
        return 0;
    }
    
    let depth = [];

    function dfs(b, w, count) { 
        w.forEach((el, idx) => {
            if (changeOneLetter(b, el)) {
                if (el === target) {
                    depth.push(count);
                } else {
                    dfs(el, w.slice(0, idx).concat(w.slice(idx+1)), count+1)
                }
            }
        })
    }
    dfs(begin, words, 1)
    return Math.min(...depth);
}

 

 

๐Ÿ“ ๋ฐฐ์šด ์  (์•„์‰ฌ์šด ์ )

  • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํ†ต๊ณผํ–ˆ์œผ๋‚˜, ์Šคํ„ฐ๋””์›๋“ค๊ณผ ๋…ผ์˜ํ•˜๋˜ ์ค‘ "begin ์—์„œ target ์œผ๋กœ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ" ๋Š” ํฌํ•จ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ผ๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ์ด๋Š” ์•„๋งˆ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ๋งŽ์ง€ ์•Š์•„ ๋ฐœ์ƒํ•œ ๋ฒ„๊ทธ์ธ ๊ฒƒ ๊ฐ™์€๋ฐ, return ๋ฌธ์—์„œ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๋ฉด ๋” ๋งŽ์€ ์ผ€์ด์Šค๋ฅผ ํฌ๊ด„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ๋‹ค. 
  • bfs ์—๋„ ์ต์ˆ™ํ•ด์ ธ์•ผ ํ•˜๋Š”๋ฐ, dfs ๋กœ๋งŒ ์ž‘์—…์„ ํ•˜๋‹ค๋ณด๋‹ˆ bfs ์‚ฌ๊ณ ๋ฅผ ์ ์  ๋ชปํ•˜๊ณ  ์žˆ๋‹ค. bfs ๋กœ๋„ ๋‹ค์‹œ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ํ›ˆ๋ จ์„ ํ•ด์•ผ๊ฒ ๋‹ค. 

๋Œ“๊ธ€