๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algorithm] ๋‹จ์–ด๋ณ€ํ™˜

๐Ÿ“‹ ๋ฌธ์ œ 

๋‘ ๊ฐœ์˜ ๋‹จ์–ด 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 ํ•ฉ๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ

"hit" "cog" ["hot", "dot", "dog", "lot", "log", "cog"] 4
"hit" "cog" ["hot", "dot", "dog", "lot", "log"] 0

 

โœ๏ธ ํ’€์ด

์ œํ•œ ์‚ฌํ•ญ์„ ๋ณด์•˜์„ ๋•Œ, ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜๊ฐ€ 50๊ฐœ๋ฅผ ๋„˜์ง€ ์•Š๊ณ  ๋‹จ์–ด์˜ ๊ธธ์ด๊ฐ€ 10์ดํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— DFS๋กœ ํ’€์–ด๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ๋‹ค. 

์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ณณ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ์—๋Š” ๋ฐฐ์—ด์„ ์ž๋ฅด๊ณ  ์ด์–ด๋ถ™์ด๊ธฐ ๋ณด๋‹ค๋Š” ๋‹จ์–ด์˜ ๊ธธ์ด๊ฐ€ ๋ฌด์กฐ๊ฑด 3์ด์ƒ์ด๋ฏ€๋กœ ''๋กœ ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค์— ๋ฐ˜๋ณต๋ฌธ ๋‚ด์—์„œ ๋นˆ ๋ฌธ์ž์—ด์ผ๋•Œ continue๋ฅผ ์ด์šฉํ•˜์—ฌ ๋„˜๊ฒจ์ฃผ๋ฉด ๋˜๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค. 

 

๋‹จ์–ด๋ฅผ ํ•˜๋‚˜์”ฉ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๋‹จ์–ด์™€ target ๋‹จ์–ด ์‚ฌ์ด์˜ ์•ŒํŒŒ๋ฒณ ์ฐจ์ด ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•ด์•ผ ํ•˜๋Š”๋ฐ split๊ณผ reduce๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ–ˆ๋‹ค. ์ด๋•Œ ์ฐจ์ด๋‚˜๋Š” ์•ŒํŒŒ๋ฒณ ๊ฐœ์ˆ˜์˜ ์ˆ˜๊ฐ€ 1์ธ ๊ฒฝ์šฐ ํ˜„์žฌ ๋ฌธ์ž๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  words ๋ฐฐ์—ด์—์„œ ํ•ด๋‹น ๋‹จ์–ด๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋ณ€๊ฒฝํ•œ ๋’ค์— ํ˜„์žฌ ๋‹จ์–ด์™€ ์ƒˆ๋กœ์šด ๋‹จ์–ด๋ฐฐ์—ด, cnt๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉฐ ์žฌ๊ท€๋กœ ๋Œ๋ ค์คฌ๋‹ค. 

 

dfs ํ•จ์ˆ˜ ์ดˆ๊ธฐ์—๋Š” ํ˜„์žฌ ๋‹จ์–ด์™€ target ๋‹จ์–ด๋ฅผ ํ™•์ธํ•˜์—ฌ ๊ฐ™๋‹ค๋ฉด ํ˜„์žฌ cnt๋ฅผ answer์™€ ๋น„๊ตํ•˜์—ฌ answer๋ฅผ ์ตœ์‹ ํ™” ์‹œ์ผœ์ฃผ์—ˆ๋‹ค.

๋˜ํ•œ, ๋‹จ์–ด ๋ฐฐ์—ด์— target์ด ์—†๋Š” ๊ฒฝ์šฐ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด๊ธฐ ๋•Œ๋ฌธ์— solution ํ•จ์ˆ˜ ๋‚ด ์ฒ˜์Œ์— filter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•˜๊ณ  ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— 0์„ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค.

 

โŒจ๏ธ ์ฝ”๋“œ

function solution(begin, target, words) {
  var answer = Infinity;

  const validation = words.filter(word => word === target);
  if (!validation.length) return 0;

  const dfs = (now, words, cnt) => {
    if (target === now) {
      answer = Math.min(answer, cnt);
      return;
    }

    for (let i = 0; i < words.length; i++) {
      const word = words[i];
      if (!word) continue;

      const diffCnt = word.split('').reduce((n, w, i) => n + (w === now[i] ? 0 : 1), 0);
      if (diffCnt === 1) {
        const nextWords = [...words];
        nextWords[i] = '';
        dfs(word, nextWords, cnt + 1);
      }
    }
  };

  dfs(begin, words, 0);

  return answer;
}

console.log(solution('hit', 'cog', ['hot', 'dot', 'dog', 'lot', 'log', 'cog']));