๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜-PS(์žฌ๊ท€)] Java๋กœ ํ•˜๋…ธ์ด ํƒ‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ :: Hanoi Tower Algorithm Java Code by recursion

by Wonit 2020. 6. 13.

ํ•˜๋…ธ์ด ํƒ‘์€ ์ •๋ง ์œ ๋ช…ํ•œ ํผ์ฆ์ด๋‹ค.
ํ•˜๋…ธ์ด ํƒ‘์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ์•Œ๊ณ ์‹ถ๋‹ค๋ฉด ํ•˜๋…ธ์ดํƒ‘ ์œ„ํ‚ค ์—์„œ ์ž์„ธํžˆ ์ฝ์–ด๋ณด๋Š” ๊ฒƒ๋„ ์žฌ๋ฐŒ์„ ๊ฒƒ ๊ฐ™๋‹ค.

ํ•˜๋…ธ์ด ํƒ‘์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด


์„ธ ๊ฐœ์˜ ๊ธฐ๋‘ฅ๊ณผ ์ด ๊ธฐ๋‘ฅ์— ๊ฝ‚์„ ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ๊ฐ€ ๋‹ค์–‘ํ•œ ์›ํŒ๋“ค์ด ์žˆ๊ณ , ํผ์ฆ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋Š” ํ•œ ๊ธฐ๋‘ฅ์— ์›ํŒ๋“ค์ด ์ž‘์€ ๊ฒƒ์ด ์œ„์— ์žˆ๋„๋ก ์ˆœ์„œ๋Œ€๋กœ ์Œ“์—ฌ ์žˆ๋‹ค.


๊ฒŒ์ž„์˜ ๋ชฉ์ ์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค๋ฉด์„œ, ํ•œ ๊ธฐ๋‘ฅ์— ๊ฝ‚ํžŒ ์›ํŒ๋“ค์„ ๊ทธ ์ˆœ์„œ ๊ทธ๋Œ€๋กœ ๋‹ค๋ฅธ ๊ธฐ๋‘ฅ์œผ๋กœ ์˜ฎ๊ฒจ์„œ ๋‹ค์‹œ ์Œ“๋Š” ๊ฒƒ์ด๋‹ค.

 

์กฐ๊ฑด

  • ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์›ํŒ๋งŒ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
  • ํฐ ์›ํŒ์ด ์ž‘์€ ์›ํŒ ์œ„์— ์žˆ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. -> ํ•ญ์ƒ ์ž‘์€ ์›๋ฐ˜์ด ์œ„์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.

ํ•˜๋…ธ์ด ํƒ‘์˜ ์›ํŒ์„ ๋ชจ๋‘ ์˜ฎ๊ธฐ๋ ค๋ฉด (2^n - 1)์˜ ๊ฒฝ์šฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ์— ๋Œ€ํ•ด์„œ ๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€์–ด๋ณด์ž.

๋ฌธ์ œ ๋ถ„์„

์ผ๋‹จ ํ•˜๋…ธ์ด ํƒ‘ ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ ๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ•ด๋ณด์ž.

 

ํ•˜๋…ธ์ด ํƒ‘์€ 3๊ฐœ์˜ ๊ธฐ๋‘ฅ์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

์‹œ์ž‘ ๊ธฐ๋‘ฅ

์‹œ์ž‘ ๊ธฐ๋‘ฅ์€ N๊ฐœ์˜ ์›ํŒ์ด ์žˆ์„ ๋•Œ ์˜ฎ๊ธฐ๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ธฐ๋‘ฅ์ด ๋œ๋‹ค.

๋ณด์กฐ ๊ธฐ๋‘ฅ

๋ณด์กฐ ๊ธฐ๋‘ฅ์€ N๊ฐœ์˜ ์›ํŒ์ด ๋ชฉํ‘œ ๊ธฐ๋‘ฅ์œผ๋กœ ์˜ฎ๊ฒจ์งˆ ๋•Œ Buffer๋กœ์จ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋‘ฅ์ด๋‹ค.

๋ชฉํ‘œ ๊ธฐ๋‘ฅ

๋ชฉํ‘œ ๊ธฐ๋‘ฅ์€ N๊ฐœ์˜ ์›ํŒ์ด ์˜ฎ๊ฒจ์ ธ์•ผ ํ•˜๋Š” ๋ชฉํ‘œ ๊ธฐ๋‘ฅ์ด ๋œ๋‹ค.


 

๊ทธ๋ฆฌ๊ณ  ์ˆœ์„œ๋Œ€๋กœ ํ•œ ๋ฒˆ ์ฐพ์•„๋ณด์ž.

1 ๊ฐœ์˜ ์›ํŒ์ด ์žˆ์„ ๋•Œ

ํ•œ ๊ฐœ์˜ ์›ํŒ์ด ์žˆ๋‹ค๋ฉด ์‹œ์ž‘ ๊ธฐ๋‘ฅ์— ํ•˜๋‚˜๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๊ณ , ๋‹จ์ง€ ์‹œ์ž‘ ๊ธฐ๋‘ฅ์—์„œ ๋ชฉํ‘œ ๊ธฐ๋‘ฅ์œผ๋กœ ์˜ฎ๊ธฐ๊ธฐ๋งŒ ํ•˜๋ฉด ๋์ด๋‹ค.

 

์ด ๊ฒƒ์„ ์ฝ”๋“œํ™” ์‹œ์ผœ๋ณธ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

void hanoi(์›ํŒ์˜ ์ˆ˜, ์‹œ์ž‘ ๊ธฐ๋‘ฅ, ๋ณด์กฐ ๊ธฐ๋‘ฅ, ๋ชฉํ‘œ ๊ธฐ๋‘ฅ) {
    if (์›ํŒ์˜ ์ˆ˜ == 1) {
        System.out.println(์‹œ์ž‘ ๊ธฐ๋‘ฅ + "->" + ๋ชฉํ‘œ ๊ธฐ๋‘ฅ);
        return;
    }
}

2 ๊ฐœ์˜ ์›ํŒ์ด ์žˆ์„ ๋•Œ

๋‘ ๊ฐœ์˜ ์›ํŒ์ด ์žˆ๋‹ค๋ฉด ์‹œ์ž‘ ๊ธฐ๋‘ฅ์— ๋‘ ๊ฐœ๊ฐ€ ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค. ๊ทธ๋Ÿผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณ ๋ณด์ž.

 

  1. ์ฒซ ๋ฒˆ์งธ ์›ํŒ์„ ๋ณด์กฐ ๊ธฐ๋‘ฅ์œผ๋กœ ์˜ฎ๊ธด๋‹ค. -> ๊ฐ€์žฅ ์ž‘์€ ์›ํŒ์„ ๋ณด์กฐ ๊ธฐ๋‘ฅ์œผ๋กœ ์˜ฎ๊ธด๋‹ค.
  2. ๋‚˜๋จธ์ง€ ์›๋ฐ˜์„ ๋ชฉํ‘œ ๊ธฐ๋‘ฅ์œผ๋กœ ์˜ฎ๊ธด๋‹ค. -> ๊ทธ๋Ÿผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์‹œ์ž‘ ๊ธฐ๋‘ฅ์—๋Š” ์ œ์ผ ํฐ ์›ํŒ๋งŒ ๋‚จ๊ฒŒ ๋œ๋‹ค.
  3. ๋ณด์กฐ ๊ธฐ๋‘ฅ์— ์žˆ๋Š” ์›ํŒ์„ ๋ชฉํ‘œ ๊ธฐ๋‘ฅ์œผ๋กœ ์˜ฎ๊ธด๋‹ค.

 

 

์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ๊ฐ€์žฅ ํฐ ์›๋ฐ˜์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์›๋ฐ˜์„ ๋ณด์กฐ ์›๋ฐ˜์œผ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.


๋˜ ์ด ๊ฒƒ์„ ์ฝ”๋“œํ™” ์‹œ์ผœ๋ณด์ž.

hanoi(์›ํŒ์˜ ์ˆ˜ - 1, ์‹œ์ž‘ ๊ธฐ๋‘ฅ, ๋ณด์กฐ ๊ธฐ๋‘ฅ, ๋ชฉํ‘œ ๊ธฐ๋‘ฅ)

์ฆ‰ ๋งจ ๋งˆ์ง€๋ง‰ ์›ํŒ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ชจ๋“  ๊ธฐ๋‘ฅ์„ ์‹œ์ž‘ ๊ธฐ๋‘ฅ -> ๋ณด์กฐ ๊ธฐ๋‘ฅ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์›ํŒ์˜ ์ˆ˜๊ฐ€ 1์ด ๋œ๋‹ค๋ฉด ์‹œ์ž‘ ๊ธฐ๋‘ฅ์— ์žˆ๋Š” ์›ํŒ์„ ๋ชฉํ‘œ ๊ธฐ๋‘ฅ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ์ผ์„ ์ˆ˜ํ–‰ํ•ด์ค€๋‹ค.

System.out.println(์‹œ์ž‘ ๊ธฐ๋‘ฅ + "->" + ๋ชฉํ‘œ ๊ธฐ๋‘ฅ);

์—ฌ๊ธฐ ๊นŒ์ง€ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด ๊ทธ๋ฆผ์˜ 3 ๋ฒˆ์งธ ๋ชจ์–‘๊ณผ ๊ฐ™์•„์งˆ ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ ์ƒ๊ฐ์„ ํ•ด๋ณด์ž.

๋ชฉํ‘œ ๊ธฐ๋‘ฅ์— ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์›ํŒ๋ณด๋‹ค ํฐ ์›ํŒ์ด ์กด์žฌํ•ด์„œ ํ•˜๋…ธ์ด์˜ ๊ทœ์น™์„ ๊นจ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„๊นŒ??


์ •๋‹ต์€ No๋‹ค.


๊ทธ๋Ÿผ ๊ฐ€์žฅ ํฐ ์›ํŒ์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์›ํŒ์—๊ฒŒ ๊ฐ™์€ ๋…ผ๋ฆฌ๋ฅผ ์ ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํƒœ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

์ด์ œ ์ด ์ƒํƒœ๋กœ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด ๋œ๋‹ค.

 

์›ํŒ์ด n๊ฐœ ์ผ ๋•Œ

์›ํŒ์ด n๊ฐœ์ผ ๋•Œ๋Š” ์•ž์˜ ๋กœ์ง์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ์ค€๋‹ค๋ฉด ๊ฑฑ์ • ์—†์ด ํ•ด๊ฒฐ๋  ๊ฒƒ์ด๋‹ค.

 

๊ทธ๊ฒƒ์„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•ด๋ณธ๋‹ค๋ฉด

void hanoi(์›ํŒ์˜ ์ˆ˜, ์‹œ์ž‘, ๋ชฉํ‘œ, ๋ณด์กฐ) {
    if (์›ํŒ์˜ ์ˆ˜ == 1) {
        System.out.println(์‹œ์ž‘ + "->" + ๋ชฉํ‘œ);
        return;
    }
    hanoi(์›ํŒ์˜ ์ˆ˜ - 1, ์‹œ์ž‘, ๋ณด์กฐ, ๋ชฉํ‘œ);
    System.out.println(์‹œ์ž‘ + "->" + ๋ชฉํ‘œ);
    hanoi(์›ํŒ์˜ ์ˆ˜ -1, ๋ณด์กฐ, ๋ชฉํ‘œ, ์‹œ์ž‘);
}

๋Œ“๊ธ€