<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>하노이의 탑 on kenji.blog</title><link>http://kenji.blog/ko/tags/%ED%95%98%EB%85%B8%EC%9D%B4%EC%9D%98-%ED%83%91/</link><description>Recent content in 하노이의 탑 on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ko</language><copyright>kenjinote</copyright><lastBuildDate>Thu, 17 Apr 2025 22:23:14 +0900</lastBuildDate><atom:link href="http://kenji.blog/ko/tags/%ED%95%98%EB%85%B8%EC%9D%B4%EC%9D%98-%ED%83%91/index.xml" rel="self" type="application/rss+xml"/><item><title>'하노이의 탑'</title><link>http://kenji.blog/ko/p/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94/</link><pubDate>Thu, 17 Apr 2025 22:23:14 +0900</pubDate><guid>http://kenji.blog/ko/p/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94/</guid><description>&lt;img src="http://kenji.blog/p/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94/img.png" alt="Featured image of post '하노이의 탑'" />&lt;h1 id="하노이의-탑">하노이의 탑
&lt;/h1>&lt;p>안녕하세요!&lt;/p>
&lt;p>오늘은 &amp;ldquo;하노이의 탑&amp;quot;에 대해 Python 샘플 프로그램을 곁들여 설명해보고자 합니다.&lt;/p>
&lt;hr>
&lt;h2 id="하노이의-탑이란">하노이의 탑이란?
&lt;/h2>&lt;p>하노이의 탑은 3개의 기둥과 여러 개의 원판을 사용하는 퍼즐입니다. 원판은 크기가 다르며, 처음에는 하나의 기둥에 크기 순서대로 쌓여 있습니다. 규칙은 다음과 같습니다:&lt;/p>
&lt;ol>
&lt;li>한 번에 옮길 수 있는 원판은 1개뿐입니다.&lt;/li>
&lt;li>작은 원판 위에 큰 원판을 놓을 수 없습니다.&lt;/li>
&lt;/ol>
&lt;p>이 퍼즐은 재귀적 사고를 배우는 데 최적의 교재로 알려져 있습니다. 재귀란 어떤 문제를 같은 종류의 더 작은 문제로 분해하여 해결하는 방법입니다. 하노이의 탑에서는 n개의 원판을 이동하기 위해 n-1개의 원판을 이동하는 조작을 반복합니다.&lt;/p>
&lt;hr>
&lt;h2 id="python으로-하노이의-탑을-풀어보자">Python으로 하노이의 탑을 풀어보자
&lt;/h2>&lt;p>아래는 Python으로 하노이의 탑을 풀기 위한 샘플 코드입니다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">hanoi&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">source&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">auxiliary&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Move disk 1 from &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">source&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> to &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">target&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hanoi&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">source&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">auxiliary&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Move disk &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> from &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">source&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> to &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">target&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hanoi&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">auxiliary&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">target&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">source&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 예: 3개의 원판을 A에서 C로 이동&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">hanoi&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;A&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;C&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;B&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>이 코드에서는 &lt;code>hanoi&lt;/code> 함수가 재귀적으로 호출되어 원판을 이동하는 순서가 출력됩니다. 예를 들어, 3개의 원판의 경우 다음과 같은 출력을 얻을 수 있습니다:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Move disk 1 from A to C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Move disk 2 from A to B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Move disk 1 from C to B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Move disk 3 from A to C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Move disk 1 from B to A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Move disk 2 from B to C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Move disk 1 from A to C
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>이렇게 재귀적인 접근 방식을 사용하면 복잡한 문제도 간단하게 해결할 수 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="64개의-원판을-옮기는-데-시간이-얼마나-걸릴까">64개의 원판을 옮기는 데 시간이 얼마나 걸릴까?
&lt;/h2>&lt;p>하노이의 탑의 이동 횟수는 최소한 2^n - 1번 필요합니다. 즉, 64개의 원판을 이동하려면 2^64 - 1번, 약 1.84×10^19번의 이동이 필요합니다. 만약 1초에 1번 이동할 수 있다고 하더라도 약 5849억 년이 걸립니다. 이것은 우주 나이(약 137억 년)의 약 42배입니다.&lt;/p>
&lt;p>이렇게 원판의 수가 늘어나면 필요한 이동 횟수가 지수함수적으로 증가합니다. 따라서 실제로 64개의 원판을 이동하는 것은 현실적이지 않습니다.&lt;/p>
&lt;hr>
&lt;h2 id="정리">정리
&lt;/h2>&lt;p>하노이의 탑은 재귀적 사고를 배우기에 가장 좋은 퍼즐입니다. Python을 사용하면 그 해법을 간단하게 구현할 수 있습니다. 하지만 원판의 수가 늘어나면 필요한 이동 횟수가 급격히 증가하므로 주의가 필요합니다.&lt;/p>
&lt;p>재귀적 접근 방식을 이해하고 실제로 코드를 작성해 보는 것으로 프로그래밍 스킬을 향상시킬 수 있습니다. 꼭 하노이의 탑에 도전해 보세요.&lt;/p>
&lt;hr></description></item></channel></rss>