๐Ÿง  codingtest/javascript 100์ œ

๋ฌธ์ œ55. ๊ณตํฌ์˜ ํ•˜๋…ธ์ด์˜ ํƒ‘

awesomeyelim 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๋ฐ”ํ€ด