ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ๋ฌธ์ œ55. ๊ณตํฌ์˜ ํ•˜๋…ธ์ด์˜ ํƒ‘
    ๐Ÿง  codingtest/javascript 100์ œ 2022. 3. 31. 09:15
    728x90

    ํ•˜๋…ธ์ด์˜ ํƒ‘์€ A,B,C 3๊ฐœ์˜ ๊ธฐ๋‘ฅ๊ณผ ๊ธฐ๋‘ฅ์— ๊ฝ‚์„ ์ˆ˜ ์žˆ๋Š” N๊ฐœ์˜ ์›ํŒ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Œ

     

    • ๋‹ค์Œ์˜ ๊ทœ์น™์„ ๋งŒ์กฑํ•ด์•ผํ•จ
    1. ์ฒ˜์Œ์˜ ๋ชจ๋“  ์›ํŒ์€ A ๊ธฐ๋‘ฅ์— ๊ฝ‚ํ˜€ ์žˆ๋‹ค
    2. ๋ชจ๋“  ์›ํŒ์˜ ์ง€๋ฆ„์€ ๋‹ค๋ฅด๋‹ค.
    3. ์ด ์›๋ฐ˜์€ ์„ธ ๊ฐœ์˜ ๊ธฐ๋‘ฅ์ค‘ ํ•˜๋‚˜์— ๋ฐ˜๋“œ์‹œ ๊ฝ‚ํ˜€์•ผ ํ•œ๋‹ค.
    4. ์ž‘์€ ์›๋ฐ˜ ์œ„์— ํฐ ์›๋ฐ˜์„ ๋†“์„ ์ˆ˜ ์—†๋‹ค.
    5. ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์›ํŒ(๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ์›ํŒ)๋งŒ์„ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

    • A ๊ธฐ๋‘ฅ์˜ ์›๋ฐ˜ N๊ฐœ๋ฅผ ๋ชจ๋‘ C์›๋ฐ˜์œผ๋กœ ์˜ฎ๊ธฐ๊ณ  ์‹ถ๋‹ค.
    • ๋ชจ๋“ ์›๋ฐ˜์„ ์˜ฎ๊ธฐ๊ธฐ ์œ„ํ•ด ์‹คํ–‰๋˜์–ด์•ผํ•  ์ตœ์†Œ ์›๋ฐ˜ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ๋ผ.

     

     

    ๋ฏธ๋ฆฌ ์ƒ๊ฐํ•ด ๋ด์•ผํ•  ๊ฒƒ

    ์›๋ฐ˜ ๊ฐฏ์ˆ˜(n)์— ๋”ฐ๋ฅธ ์ด๋™ ํšŸ์ˆ˜

    • n = 1, 1๋ฒˆ
      n = 2, 3๋ฒˆ
      n = 3, 7๋ฒˆ
      n = 5, 15๋ฒˆ

     

    ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ํ™”์‹์„ ๊ฐ€์ง„๋‹ค

    • 2^n - 1 = ์ด๋™ํšŸ์ˆ˜

    ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋™๊ฒฝ๋กœ๋Š” ์–ด๋–ป๊ฒŒ ์ถ”์ ํ• ์ˆ˜ ์žˆ์„๊นŒ?

    • ์œ„์™€ ๊ฐ™์€ ์ ํ™”์‹์— ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ถ”์ ํ•ด๋ณด์ž

     

     ์ •๋‹ต

    const route = [];
    
    function hanoi(์›๋ฐ˜์˜์ˆ˜, ์‹œ์ž‘๊ธฐ๋‘ฅA, ๋ชฉํ‘œ๊ธฐ๋‘ฅC, ๋ณด์กฐ๊ธฐ๋‘ฅB){
      // ์›ํŒ์ด ํ•œ๊ฐœ ์ผ๋•Œ๋Š” ๋ฐ”๋กœ ์˜ฎ๊ธฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
      if (์›๋ฐ˜์˜์ˆ˜ === 1){
        route.push([์‹œ์ž‘๊ธฐ๋‘ฅA, ๋ชฉํ‘œ๊ธฐ๋‘ฅC]);
        return 1;
      }
    
      // ์›๋ฐ˜์ด n-1๊ฐœ๋ฅผ ๋ณด์กฐ๊ธฐ๋‘ฅ์œผ๋กœ ์˜ฎ๊ธฐ๊ณ 
      hanoi(์›๋ฐ˜์˜์ˆ˜-1, ์‹œ์ž‘๊ธฐ๋‘ฅA, ๋ณด์กฐ๊ธฐ๋‘ฅB, ๋ชฉํ‘œ๊ธฐ๋‘ฅC)
      // ๊ฐ€์žฅ ํฐ ์›๋ฐ˜์€ ๋ชฉํ‘œ๊ธฐ๋‘ฅC์œผ๋กœ
      route.push([์‹œ์ž‘๊ธฐ๋‘ฅA, ๋ชฉํ‘œ๊ธฐ๋‘ฅC])
      // ๋ณด์กฐ๊ธฐ๋‘ฅ๊ณผ ์‹œ์ž‘๊ธฐ๋‘ฅA์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
      hanoi(์›๋ฐ˜์˜์ˆ˜-1, ๋ณด์กฐ๊ธฐ๋‘ฅB, ๋ชฉํ‘œ๊ธฐ๋‘ฅC, ์‹œ์ž‘๊ธฐ๋‘ฅA) 
    }
    
    hanoi(3, 'A', 'C' ,'B');
    console.log(route); // ์ด๋™๊ฒฝ๋กœ
    console.log(route.length);

    ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅ๋œ๋‹ค

     

    > ์—ญ์ถ”์ 

    function hanoi(์›๋ฐ˜์˜์ˆ˜, ์‹œ์ž‘๊ธฐ๋‘ฅA, ๋ชฉํ‘œ๊ธฐ๋‘ฅC, ๋ณด์กฐ๊ธฐ๋‘ฅB){ } ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ์‚ดํŽด๋ณด์ž !

    1. ์›๋ฐ˜์ด ํ•˜๋‚˜์ผ ๋•Œ๋Š” ์‹œ์ž‘A -> ๋ชฉํ‘œC ๋กœ ๋ฐ”๋กœ ์ด๋™์„ ํ•˜๋ฉด๋œ๋‹ค.

      if (์›๋ฐ˜์˜์ˆ˜ === 1){
        route.push([์‹œ์ž‘๊ธฐ๋‘ฅA, ๋ชฉํ‘œ๊ธฐ๋‘ฅC]);
        return 1;
      }

     

    2. ์›๋ฐ˜๊ฐฏ์ˆ˜๋ฅผ 3์œผ๋กœ ๊ฐ€์ •ํ–ˆ์„๋•Œ

      // ์›๋ฐ˜์ด n-1๊ฐœ๋ฅผ ๋ณด์กฐ๊ธฐ๋‘ฅB๋กœ ์˜ฎ๊ธฐ๊ณ 
      hanoi(์›๋ฐ˜์˜์ˆ˜-1, ์‹œ์ž‘๊ธฐ๋‘ฅA, ๋ณด์กฐ๊ธฐ๋‘ฅB, ๋ชฉํ‘œ๊ธฐ๋‘ฅC)
      // ๊ฐ€์žฅ ํฐ ์›๋ฐ˜์€ ๋ชฉํ‘œ๊ธฐ๋‘ฅC์œผ๋กœ
      route.push([์‹œ์ž‘๊ธฐ๋‘ฅA, ๋ชฉํ‘œ๊ธฐ๋‘ฅC])
      // ๋ณด์กฐ๊ธฐ๋‘ฅB๊ณผ ์‹œ์ž‘๊ธฐ๋‘ฅA์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
      hanoi(์›๋ฐ˜์˜์ˆ˜-1, ๋ณด์กฐ๊ธฐ๋‘ฅB, ๋ชฉํ‘œ๊ธฐ๋‘ฅC, ์‹œ์ž‘๊ธฐ๋‘ฅA)

    3. ์žฌ๊ท€ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ˆœ์„œ๋ฅผ ๋”ฐ์ ธ๋ณด๋ฉฐ ๊ฒฐ๊ณผ ๋„์ถœ์„ ์ƒ๊ฐํ•ด๋ณด์ž

    function ํ•˜๋…ธ์ด(3, 'A', 'C' ,'B')
     function ํ•˜๋…ธ์ด(2, 'A', 'B' ,'C')
      function ํ•˜๋…ธ์ด(1, 'A', 'C' ,'B')
       ์›ํŒ์˜์ด๋™๊ฒฝ๋กœ.push('A', 'C') // 1๋ฒˆ์งธ 
      ์›ํŒ์˜์ด๋™๊ฒฝ๋กœ.push('A', 'B')// 2๋ฒˆ์งธ
      function ํ•˜๋…ธ์ด(1, 'C', 'B', 'A')
       ์›ํŒ์˜์ด๋™๊ฒฝ๋กœ.push('C', 'B')// 3๋ฒˆ์งธ
       ----------------------------------- 1๋ฐ”ํ€ด
    
       ์›ํŒ์˜์ด๋™๊ฒฝ๋กœ.push('A', 'C')// 4๋ฒˆ์งธ
    
    function ํ•˜๋…ธ์ด(2, 'B', 'C' ,'A')
     function ํ•˜๋…ธ์ด(1, 'B', 'A' ,'C')
        ์›ํŒ์˜์ด๋™๊ฒฝ๋กœ.push('B', 'A') // 5๋ฒˆ์งธ
      ์›ํŒ์˜์ด๋™๊ฒฝ๋กœ.push('B', 'C')// 6๋ฒˆ์งธ
      function ํ•˜๋…ธ์ด(1, 'A', 'C', 'B')
        ์›ํŒ์˜์ด๋™๊ฒฝ๋กœ.push('A', 'C')// 7๋ฒˆ์งธ
       ----------------------------------- 2๋ฐ”ํ€ด

    ๋Œ“๊ธ€