ํ๋
ธ์ด ํ์ ์ ๋ง ์ ๋ช
ํ ํผ์ฆ์ด๋ค.
ํ๋
ธ์ด ํ์ ๋ํด์ ์์ธํ ์๊ณ ์ถ๋ค๋ฉด ํ๋
ธ์ดํ ์ํค ์์ ์์ธํ ์ฝ์ด๋ณด๋ ๊ฒ๋ ์ฌ๋ฐ์ ๊ฒ ๊ฐ๋ค.
ํ๋ ธ์ด ํ์ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ์๋ฉด
์ธ ๊ฐ์ ๊ธฐ๋ฅ๊ณผ ์ด ๊ธฐ๋ฅ์ ๊ฝ์ ์ ์๋ ํฌ๊ธฐ๊ฐ ๋ค์ํ ์ํ๋ค์ด ์๊ณ , ํผ์ฆ์ ์์ํ๊ธฐ ์ ์๋ ํ ๊ธฐ๋ฅ์ ์ํ๋ค์ด ์์ ๊ฒ์ด ์์ ์๋๋ก ์์๋๋ก ์์ฌ ์๋ค.
๊ฒ์์ ๋ชฉ์ ์ ๋ค์ ๋ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑ์ํค๋ฉด์, ํ ๊ธฐ๋ฅ์ ๊ฝํ ์ํ๋ค์ ๊ทธ ์์ ๊ทธ๋๋ก ๋ค๋ฅธ ๊ธฐ๋ฅ์ผ๋ก ์ฎ๊ฒจ์ ๋ค์ ์๋ ๊ฒ์ด๋ค.
์กฐ๊ฑด
- ํ ๋ฒ์ ํ๋์ ์ํ๋ง ์ฎ๊ธธ ์ ์๋ค.
- ํฐ ์ํ์ด ์์ ์ํ ์์ ์์ด์๋ ์ ๋๋ค. -> ํญ์ ์์ ์๋ฐ์ด ์์ ์์ด์ผ ํ๋ค.
ํ๋ ธ์ด ํ์ ์ํ์ ๋ชจ๋ ์ฎ๊ธฐ๋ ค๋ฉด (2^n - 1)์ ๊ฒฝ์ฐ๊ฐ ํ์ํ๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ฌ๊ท ํธ์ถ์ ๋ํด์ ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๊ณ ๊ฐ๋จํ๊ฒ ํ์ด๋ณด์.
๋ฌธ์ ๋ถ์
์ผ๋จ ํ๋ ธ์ด ํ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด์ ๋ฌธ์ ๋ฅผ ๋ถ์ํด๋ณด์.
ํ๋ ธ์ด ํ์ 3๊ฐ์ ๊ธฐ๋ฅ์ผ๋ก ๋๋ ์ ์๋ค.
์์ ๊ธฐ๋ฅ
์์ ๊ธฐ๋ฅ์ N๊ฐ์ ์ํ์ด ์์ ๋ ์ฎ๊ธฐ๊ธฐ๋ฅผ ์์ํ๋ ๊ธฐ๋ฅ์ด ๋๋ค.
๋ณด์กฐ ๊ธฐ๋ฅ
๋ณด์กฐ ๊ธฐ๋ฅ์ N๊ฐ์ ์ํ์ด ๋ชฉํ ๊ธฐ๋ฅ์ผ๋ก ์ฎ๊ฒจ์ง ๋ Buffer๋ก์จ ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ด๋ค.
๋ชฉํ ๊ธฐ๋ฅ
๋ชฉํ ๊ธฐ๋ฅ์ N๊ฐ์ ์ํ์ด ์ฎ๊ฒจ์ ธ์ผ ํ๋ ๋ชฉํ ๊ธฐ๋ฅ์ด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์๋๋ก ํ ๋ฒ ์ฐพ์๋ณด์.
1 ๊ฐ์ ์ํ์ด ์์ ๋
ํ ๊ฐ์ ์ํ์ด ์๋ค๋ฉด ์์ ๊ธฐ๋ฅ์ ํ๋๊ฐ ์์ ๊ฒ์ด๊ณ , ๋จ์ง ์์ ๊ธฐ๋ฅ์์ ๋ชฉํ ๊ธฐ๋ฅ์ผ๋ก ์ฎ๊ธฐ๊ธฐ๋ง ํ๋ฉด ๋์ด๋ค.
์ด ๊ฒ์ ์ฝ๋ํ ์์ผ๋ณธ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
void hanoi(์ํ์ ์, ์์ ๊ธฐ๋ฅ, ๋ณด์กฐ ๊ธฐ๋ฅ, ๋ชฉํ ๊ธฐ๋ฅ) {
if (์ํ์ ์ == 1) {
System.out.println(์์ ๊ธฐ๋ฅ + "->" + ๋ชฉํ ๊ธฐ๋ฅ);
return;
}
}
2 ๊ฐ์ ์ํ์ด ์์ ๋
๋ ๊ฐ์ ์ํ์ด ์๋ค๋ฉด ์์ ๊ธฐ๋ฅ์ ๋ ๊ฐ๊ฐ ์๋ ์ํ์ด๋ค. ๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ณด์.
- ์ฒซ ๋ฒ์งธ ์ํ์ ๋ณด์กฐ ๊ธฐ๋ฅ์ผ๋ก ์ฎ๊ธด๋ค. -> ๊ฐ์ฅ ์์ ์ํ์ ๋ณด์กฐ ๊ธฐ๋ฅ์ผ๋ก ์ฎ๊ธด๋ค.
- ๋๋จธ์ง ์๋ฐ์ ๋ชฉํ ๊ธฐ๋ฅ์ผ๋ก ์ฎ๊ธด๋ค. -> ๊ทธ๋ผ ์์ฐ์ค๋ฝ๊ฒ ์์ ๊ธฐ๋ฅ์๋ ์ ์ผ ํฐ ์ํ๋ง ๋จ๊ฒ ๋๋ค.
- ๋ณด์กฐ ๊ธฐ๋ฅ์ ์๋ ์ํ์ ๋ชฉํ ๊ธฐ๋ฅ์ผ๋ก ์ฎ๊ธด๋ค.
์ฌ๊ธฐ์ ํต์ฌ์ ๊ฐ์ฅ ํฐ ์๋ฐ์ ์ ์ธํ ๋๋จธ์ง ์๋ฐ์ ๋ณด์กฐ ์๋ฐ์ผ๋ก ์ฎ๊ฒจ์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
๋ ์ด ๊ฒ์ ์ฝ๋ํ ์์ผ๋ณด์.
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, ๋ณด์กฐ, ๋ชฉํ, ์์);
}
๋๊ธ