<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://ssangwonpark.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://ssangwonpark.github.io/" rel="alternate" type="text/html" /><updated>2025-03-25T07:39:25+00:00</updated><id>https://ssangwonpark.github.io/feed.xml</id><title type="html">SSangWon’s Blog</title><subtitle>공부 중</subtitle><author><name>Park SangWon</name></author><entry><title type="html">Chapter 4 스택</title><link href="https://ssangwonpark.github.io/Chapter4/" rel="alternate" type="text/html" title="Chapter 4 스택" /><published>2025-03-22T00:00:00+00:00</published><updated>2025-03-22T00:00:00+00:00</updated><id>https://ssangwonpark.github.io/Chapter4</id><content type="html" xml:base="https://ssangwonpark.github.io/Chapter4/"><![CDATA[<h2 id="스택">스택</h2>

<h3 id="스택이란-쌓아놓은-더미를-의미한다">스택이란, 쌓아놓은 더미를 의미한다.</h3>

<h3 id="스택의-특징-후입선출lipo-last-in-first-out">스택의 특징, 후입선출(LIPO: Last-in First-out)</h3>

<h4 id="가장-최근에-들어온-데이터가-가장-먼저-나간다">가장 최근에 들어온 데이터가 가장 먼저 나간다.</h4>

<p><img src="../images/2025-03-24-15-40-00.png" alt="" /></p>

<p>push()에 데이터를 쌓고, pop()에 내보내고 있다.<br />
이를 코드로 나타내면 아래와 같다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="n">stack</span><span class="p">[</span><span class="mi">5</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">top</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>

<span class="kt">int</span> <span class="nf">isEmpty</span><span class="p">(){</span>
    <span class="k">return</span> <span class="p">(</span><span class="n">top</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">isFull</span><span class="p">(){</span>
    <span class="k">return</span> <span class="p">(</span><span class="n">top</span> <span class="o">==</span> <span class="mi">4</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">push</span><span class="p">(</span><span class="kt">int</span> <span class="n">value</span><span class="p">){</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">isFull</span><span class="p">()</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span><span class="p">;</span> <span class="c1">// 꽉 찼으면 못 넣는다.</span>
    <span class="p">}</span>

    <span class="n">top</span><span class="o">++</span><span class="p">;</span>
    <span class="n">stack</span><span class="p">[</span><span class="n">top</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">pop</span><span class="p">(){</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">isEmpty</span><span class="p">()</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="o">-</span><span class="mi">999</span><span class="p">;</span>    <span class="c1">// 비어있다는 의미로 -999 반환</span>
    <span class="p">}</span>

    <span class="kt">int</span> <span class="n">result</span> <span class="o">=</span> <span class="n">stack</span><span class="p">[</span><span class="n">top</span><span class="p">];</span>
    <span class="n">top</span><span class="o">--</span><span class="p">;</span>

    <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>

    <span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<hr />

<h3 id="스택의-활용">스택의 활용</h3>

<p>스택을 이용하면 후위계산식을 풀이하거나, 괄호를 짝지어 체크하는 문제 등 스택의 특성을 이용해 다양한 문제를 효과적으로 풀이 가능하다.<br />
아래는 스택으로 백트래킹으로 길찾기 알고리즘을 구현해 미로 만들기 문제를 풀이하겠다.</p>

<hr />

<h3 id="미로만들기">미로만들기</h3>

<p>다음 조건을 만족하며, 문제를 풀어보자.</p>

<ol>
  <li>미로의 크기 n 입력 받기 (n &gt;= 5, n &lt;= 30)</li>
  <li>미로의 표기: 1은 벽 0은 통로</li>
  <li>시작지점은 (0,0), 도착지점은 (n-1, n-1)</li>
  <li>random 함수를 이용해 벽을 임의의 위치에 생성</li>
  <li>미로 길찾기 알고리즘을 이용해 경로 파악</li>
  <li>경로가 있으면 4번 / 없다면 4번에서 만든 벽을 지우고 다시 4번</li>
  <li>(n * n)의 미로의 70% 이상이 벽이 될 때까지 위 과정 반복.</li>
  <li>미로 완성본 출력</li>
</ol>

<p>과정을 플로우 차트로 간단하게 그리면 다음과 같다.</p>

<p><img src="../images/2025-03-24-15-15-36.png" alt="" /></p>

<hr />

<h4 id="입력받기">입력받기</h4>

<p>문제를 풀기 위해 먼저 입력을 받아야 한다.<br />
입력은 (n &gt;= 5, n &lt;= 30)으로 사용자에 따라 바뀌기 때문에 이전 챕터에 나왔던 동적할당을 이용하겠다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 좌표 정보를 나타내는 구조체</span>
<span class="k">struct</span> <span class="n">COORD</span><span class="p">{</span>
  <span class="kt">int</span> <span class="n">row</span><span class="p">;</span>
  <span class="kt">int</span> <span class="n">col</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="n">COORD</span> <span class="n">path_stack</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>     <span class="c1">// 스택(경로 저장)</span>
<span class="k">struct</span> <span class="n">COORD</span> <span class="n">visited</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>        <span class="c1">// 방문한 좌표 저장</span>
<span class="kt">int</span> <span class="o">**</span><span class="n">maze</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>                  <span class="c1">// 미로</span>
<span class="kt">int</span> <span class="n">top</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>                       <span class="c1">// path_stack의 top</span>
<span class="kt">int</span> <span class="n">visitedIndex</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>              <span class="c1">// visited의 index</span>
<span class="kt">int</span> <span class="n">size</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>                       <span class="c1">// 미로의 크기 ( size * size )</span>
<span class="kt">int</span> <span class="n">wallcount</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>                  <span class="c1">// 생성된 벽의 수</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

  <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">size</span><span class="p">);</span>

  <span class="k">struct</span> <span class="n">COORD</span> <span class="n">start_point</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span> <span class="p">};</span>                <span class="c1">// 시작지점</span>
  <span class="k">struct</span> <span class="n">COORD</span> <span class="n">dest_point</span> <span class="o">=</span> <span class="p">{</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">size</span> <span class="o">-</span><span class="mi">1</span> <span class="p">};</span>    <span class="c1">// 종료지점</span>

  <span class="c1">// 미로와 문제풀이에 사용할 스택과 배열 동적할당.</span>
  <span class="n">maze</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span> <span class="o">**</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="n">size</span> <span class="o">*</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="p">));</span>

  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="n">maze</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="n">size</span> <span class="o">*</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">));</span>
  <span class="p">}</span>

  <span class="n">path_stack</span> <span class="o">=</span> <span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="n">size</span> <span class="o">*</span> <span class="n">size</span> <span class="o">*</span> <span class="k">sizeof</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span><span class="p">));</span>
  <span class="n">visited</span> <span class="o">=</span> <span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="n">size</span> <span class="o">*</span> <span class="n">size</span> <span class="o">*</span> <span class="k">sizeof</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span><span class="p">));</span>

  <span class="c1">// 랜덤 시드 값</span>
  <span class="n">srand</span><span class="p">(</span><span class="n">time</span><span class="p">(</span><span class="nb">NULL</span><span class="p">));</span>

  <span class="c1">// 미로 초기화 모두 0으로</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
    <span class="p">{</span>
      <span class="n">maze</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>

  <span class="c1">// 동적할당 해제</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="n">free</span><span class="p">(</span><span class="n">maze</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
  <span class="p">}</span>
  <span class="n">free</span><span class="p">(</span><span class="n">maze</span><span class="p">);</span>

  <span class="n">free</span><span class="p">(</span><span class="n">path_stack</span><span class="p">);</span>
  <span class="n">free</span><span class="p">(</span><span class="n">visited</span><span class="p">);</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>동적할당을 통해 미로의 크기를 받아 사용할 변수들에 크기를 선언해주었다. <br />
미로를 더블 포인터가 아닌 싱글 포인터로 <code class="language-plaintext highlighter-rouge">maze = (int *)malloc(size * size * sizeof(int));</code>로 사용가능하지만 그렇게하면 이후에 <code class="language-plaintext highlighter-rouge">maze(row * size + col)</code>같은 형태로 사용해야 해서 더블 포인터를 이용해 2차원 배열처럼 만들어 주었다.</p>

<hr />

<h4 id="미로-길찾기-알고리즘">미로 길찾기 알고리즘</h4>

<p>우리가 가장 쉽게 생각할 수 있는 미로의 길 찾기는 한칸씩 움직이며 3가지를 고려하는 것이다.<br />
지도 영역 내인지? 벽이 있는지? 이미 가본 적 있는 길인지? 이 세 가지를 4방향으로 고려해보자.<br />
상하좌우를 각각 3가지를 고려한다면, 다음에 어떤 위치로 가야하는지 알 수 있다.<br />
이를 코드로 표현하면 다음과 같다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 스택 관련 함수</span>
<span class="kt">int</span> <span class="nf">isStackEmpty</span><span class="p">(){</span>
  <span class="k">return</span> <span class="p">(</span><span class="n">top</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">isStackFull</span><span class="p">(){</span>
  <span class="k">return</span> <span class="p">(</span><span class="n">top</span> <span class="o">==</span> <span class="p">(</span><span class="n">size</span> <span class="o">*</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">));</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">push</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_c</span><span class="p">){</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">isStackFull</span><span class="p">())</span>
  <span class="p">{</span>
  <span class="k">return</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="n">top</span><span class="o">++</span><span class="p">;</span>
  <span class="n">path_stack</span><span class="p">[</span><span class="n">top</span><span class="p">]</span> <span class="o">=</span> <span class="n">_c</span><span class="p">;</span>
  <span class="k">return</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">struct</span> <span class="n">COORD</span> <span class="nf">pop</span><span class="p">(){</span>

  <span class="k">struct</span> <span class="n">COORD</span> <span class="n">result</span> <span class="o">=</span> <span class="p">{</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span> <span class="p">};</span>

  <span class="k">if</span> <span class="p">(</span><span class="n">isStackEmpty</span><span class="p">())</span>
  <span class="p">{</span>
  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="n">result</span> <span class="o">=</span> <span class="n">path_stack</span><span class="p">[</span><span class="n">top</span><span class="p">];</span>
  <span class="n">top</span><span class="o">--</span><span class="p">;</span>
  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// peek (pop과 유사하지만 실제로 pop은 하지 않고 맨 위의 값을 보기만 함.)</span>
<span class="k">struct</span> <span class="n">COORD</span> <span class="nf">peek</span><span class="p">(){</span>
  <span class="k">struct</span> <span class="n">COORD</span> <span class="n">result</span> <span class="o">=</span> <span class="p">{</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span> <span class="p">};</span>

  <span class="k">if</span> <span class="p">(</span><span class="n">isStackEmpty</span><span class="p">())</span>
  <span class="p">{</span>
  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="n">result</span> <span class="o">=</span> <span class="n">path_stack</span><span class="p">[</span><span class="n">top</span><span class="p">];</span>
  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// 길찾기 관련 함수</span>

<span class="c1">// 좌표 _c를 방문했었는지 판단</span>
<span class="c1">// 했었으면 1 아니면 zero</span>
<span class="kt">int</span> <span class="nf">checkVisited</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_c</span><span class="p">){</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">visitedIndex</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">visited</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">col</span> <span class="o">==</span> <span class="n">_c</span><span class="p">.</span><span class="n">col</span> <span class="o">&amp;&amp;</span> <span class="n">visited</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">row</span> <span class="o">==</span> <span class="n">_c</span><span class="p">.</span><span class="n">row</span><span class="p">)</span>
    <span class="p">{</span>
      <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>

  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">addToVisited</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_c</span><span class="p">){</span>

  <span class="c1">// 있는지를 검사한다.</span>
  <span class="c1">// 없으면 추가한다. 이때 인덱스를 먼저 증가시킨다.</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">checkVisited</span><span class="p">(</span><span class="n">_c</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">){</span>
    <span class="n">visitedIndex</span><span class="o">++</span><span class="p">;</span>
    <span class="n">visited</span><span class="p">[</span><span class="n">visitedIndex</span><span class="p">]</span> <span class="o">=</span> <span class="n">_c</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// _c가 _dst와 같은지 판단.</span>
<span class="c1">// 같으면 non-zero를 반화, 아니면 0을 반환</span>
<span class="kt">int</span> <span class="nf">checkDestination</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_c</span><span class="p">,</span> <span class="k">struct</span> <span class="n">COORD</span> <span class="n">_dst</span><span class="p">){</span>
  <span class="k">return</span> <span class="p">(</span><span class="n">_c</span><span class="p">.</span><span class="n">row</span> <span class="o">==</span> <span class="n">_dst</span><span class="p">.</span><span class="n">row</span> <span class="o">&amp;&amp;</span> <span class="n">_c</span><span class="p">.</span><span class="n">col</span> <span class="o">==</span> <span class="n">_dst</span><span class="p">.</span><span class="n">col</span><span class="p">);</span>
<span class="p">}</span>

<span class="c1">// _c가 영역 내에 있으면 1, 아니면 0</span>
<span class="kt">int</span> <span class="nf">isWithinMap</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_c</span><span class="p">){</span>
  <span class="k">return</span> <span class="p">((</span><span class="n">_c</span><span class="p">.</span><span class="n">row</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">_c</span><span class="p">.</span><span class="n">row</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">_c</span><span class="p">.</span><span class="n">col</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">_c</span><span class="p">.</span><span class="n">col</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">));</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">isWall</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_c</span><span class="p">){</span>
  <span class="k">return</span> <span class="p">(</span><span class="mi">1</span> <span class="o">==</span> <span class="n">maze</span><span class="p">[</span><span class="n">_c</span><span class="p">.</span><span class="n">row</span><span class="p">][</span><span class="n">_c</span><span class="p">.</span><span class="n">col</span><span class="p">]);</span>
<span class="p">}</span>

<span class="c1">// _c를 기준으로 갈 수 있는 좌표 1곳을 반환</span>
<span class="c1">// 만약 없으면 (-1, -1) 반환</span>
<span class="k">struct</span> <span class="n">COORD</span> <span class="nf">findWhereToGo</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_c</span><span class="p">){</span>

  <span class="c1">// 체크할 방향을 저장하는 변수</span>
  <span class="k">struct</span> <span class="n">COORD</span> <span class="n">target</span><span class="p">;</span>

  <span class="c1">// 1. 지도 영역 내인가?</span>
  <span class="c1">// 2. 벽인가?</span>
  <span class="c1">// 3. 가본 적 있나?</span>

  <span class="c1">// 위</span>
  <span class="n">target</span><span class="p">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">row</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
  <span class="n">target</span><span class="p">.</span><span class="n">col</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">col</span><span class="p">;</span>

  <span class="k">if</span> <span class="p">(</span><span class="n">isWithinMap</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">isWall</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">checkVisited</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="k">return</span> <span class="n">target</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="c1">// 아래</span>
  <span class="n">target</span><span class="p">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">row</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
  <span class="n">target</span><span class="p">.</span><span class="n">col</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">col</span><span class="p">;</span>

  <span class="k">if</span> <span class="p">(</span><span class="n">isWithinMap</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">isWall</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">checkVisited</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="k">return</span> <span class="n">target</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="c1">// 왼쪽</span>
  <span class="n">target</span><span class="p">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">row</span><span class="p">;</span>
  <span class="n">target</span><span class="p">.</span><span class="n">col</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">col</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>

  <span class="k">if</span> <span class="p">(</span><span class="n">isWithinMap</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">isWall</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">checkVisited</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="k">return</span> <span class="n">target</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="c1">// 오른쪽</span>
  <span class="n">target</span><span class="p">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">row</span><span class="p">;</span>
  <span class="n">target</span><span class="p">.</span><span class="n">col</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">col</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>

  <span class="k">if</span> <span class="p">(</span><span class="n">isWithinMap</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">isWall</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">checkVisited</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="k">return</span> <span class="n">target</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="n">target</span><span class="p">.</span><span class="n">row</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
  <span class="n">target</span><span class="p">.</span><span class="n">col</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>

  <span class="k">return</span> <span class="n">target</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// _s에서 _d까지 경로를 출력하는 함수</span>
<span class="kt">void</span> <span class="nf">findPath</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_s</span><span class="p">,</span> <span class="k">struct</span> <span class="n">COORD</span> <span class="n">_d</span><span class="p">,</span> <span class="k">struct</span> <span class="n">COORD</span> <span class="n">_wall</span><span class="p">){</span>

  <span class="c1">// 현재 위치를 설정</span>
  <span class="k">struct</span> <span class="n">COORD</span> <span class="n">current</span> <span class="o">=</span> <span class="n">_s</span><span class="p">;</span>

  <span class="c1">// 출발 좌표 저장</span>
  <span class="n">addToVisited</span><span class="p">(</span><span class="n">current</span><span class="p">);</span>

  <span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="c1">// 현재 위치에서 가는 곳을 찾는다.</span>
    <span class="k">struct</span> <span class="n">COORD</span> <span class="n">whereToGO</span> <span class="o">=</span> <span class="n">findWhereToGo</span><span class="p">(</span><span class="n">current</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">whereToGO</span><span class="p">.</span><span class="n">row</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">whereToGO</span><span class="p">.</span><span class="n">col</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
    <span class="p">{</span>   <span class="c1">// 갈 곳이 있음</span>
      <span class="n">push</span><span class="p">(</span><span class="n">current</span><span class="p">);</span>  <span class="c1">// 경로를 저장해 둔다.</span>
      <span class="n">current</span> <span class="o">=</span> <span class="n">whereToGO</span><span class="p">;</span>  <span class="c1">// current는 항상 현재 위치를 표시</span>

      <span class="n">addToVisited</span><span class="p">(</span><span class="n">current</span><span class="p">);</span>  <span class="c1">// 내가 여기 왔다고 표시</span>

      <span class="k">if</span> <span class="p">(</span><span class="n">checkDestination</span><span class="p">(</span><span class="n">current</span><span class="p">,</span> <span class="n">_d</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
      <span class="p">{</span>
        <span class="c1">// 도착. stack에 들어있는 경로 출력</span>
        <span class="c1">// 이후 미로 만들기에서는 수정될 부분.</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">top</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
        <span class="p">{</span>
          <span class="n">printf</span><span class="p">(</span><span class="s">"( %d, %d )</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">path_stack</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">row</span><span class="p">,</span> <span class="n">path_stack</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">col</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="n">printf</span><span class="p">(</span><span class="s">"목적지 도착! (%d, %d)</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">current</span><span class="p">.</span><span class="n">row</span><span class="p">,</span> <span class="n">current</span><span class="p">.</span><span class="n">col</span><span class="p">);</span>
        <span class="k">return</span><span class="p">;</span>
      <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">else</span>
    <span class="p">{</span>   <span class="c1">// 갈 곳이 없음</span>
      <span class="k">while</span> <span class="p">(</span><span class="mi">1</span><span class="p">)</span>
      <span class="p">{</span>
        <span class="c1">// top_coord &lt;= stack의 맨 위에 있는 곳을 peek</span>
        <span class="k">struct</span> <span class="n">COORD</span> <span class="n">top_coord</span> <span class="o">=</span> <span class="n">peek</span><span class="p">();</span>

        <span class="c1">// top_coord (-1, -1) : stack이 비었음... 경로 없음</span>
        <span class="c1">// 더 이상 돌아갈 곳이 없음. 프로그램 종료.</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">top_coord</span><span class="p">.</span><span class="n">row</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">top_coord</span><span class="p">.</span><span class="n">col</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
       <span class="p">{</span>
          <span class="c1">// 이후 미로 만들기에선는 수정될 부분.</span>
          <span class="n">printf</span><span class="p">(</span><span class="s">"경로가 없습니다.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
          <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="n">whereToGO</span> <span class="o">=</span> <span class="n">findWhereToGo</span><span class="p">(</span><span class="n">top_coord</span><span class="p">);</span>

       <span class="k">if</span> <span class="p">(</span><span class="n">whereToGO</span><span class="p">.</span><span class="n">row</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">whereToGO</span><span class="p">.</span><span class="n">col</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
       <span class="p">{</span>
          <span class="c1">// findWhereToGo(top_coord) =&gt; (-1, -1)</span>
          <span class="c1">// 이 좌표는 도움이 안됨. 더 이전으로 가야함. 이 좌표는 버림</span>
          <span class="n">pop</span><span class="p">();</span>  <span class="c1">// top_coord를 날려버림.</span>
        <span class="p">}</span>
        <span class="k">else</span>
        <span class="p">{</span>
          <span class="c1">// findWhereToGo(top_coord) =&gt; 유효한 좌표 찾기 성공</span>
          <span class="c1">// current = whereToGo</span>
          <span class="c1">// push가 필요 없음, 아직 top_coord가 스택에 존재하기 때문.</span>
          <span class="c1">// addToVisited(current)</span>
          <span class="n">current</span> <span class="o">=</span> <span class="n">whereToGO</span><span class="p">;</span>
          <span class="n">addToVisited</span><span class="p">(</span><span class="n">current</span><span class="p">);</span>
          <span class="k">break</span><span class="p">;</span>
        <span class="p">}</span>
      <span class="p">}</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p><strong>스택 관련 함수</strong><br />
<code class="language-plaintext highlighter-rouge">isStackEmpty</code>: 스택이 비어있는지 확인하는 함수.<br />
<code class="language-plaintext highlighter-rouge">isStackFull</code>: 스택이 가득 차있는지 확인하는 함수.<br />
<code class="language-plaintext highlighter-rouge">push</code>: 스택에 값을 넣어주기 위한 함수.<br />
<code class="language-plaintext highlighter-rouge">pop</code>: 스택에 값을 제거하기 위한 함수.<br />
<code class="language-plaintext highlighter-rouge">peek</code>: <code class="language-plaintext highlighter-rouge">pop</code>과 비슷하지만, 제거하지않고 위의 값을 보기만 하는 함수.<br /><br /></p>

<p><strong>길찾기 관련 함수</strong><br />
<code class="language-plaintext highlighter-rouge">checkVisited</code>: 좌표를 방문했는지 확인하는 함수.<br />
<code class="language-plaintext highlighter-rouge">ddToVisited</code>: 방문한 좌표를 <code class="language-plaintext highlighter-rouge">visited</code>배열에 추가하는 함수.<br />
<code class="language-plaintext highlighter-rouge">checkDestination</code>: 도착 위치에 도달했는지 확인하는 함수.<br />
<code class="language-plaintext highlighter-rouge">isWithinMap</code>: 미로 영역 내에 존재하는지 확인하는 함수.<br />
<code class="language-plaintext highlighter-rouge">isWall</code>: 벽인지 아닌지 확인하는 함수.<br />
<code class="language-plaintext highlighter-rouge">findWhereToGo</code>: <code class="language-plaintext highlighter-rouge">isWithinMap</code>, <code class="language-plaintext highlighter-rouge">isWall</code>, <code class="language-plaintext highlighter-rouge">checkVisited</code>를 이용해 상하좌우 좌표에 대해 갈 수 있는지 확인하는 함수.<br />
<code class="language-plaintext highlighter-rouge">findPath</code>: 길찾기 관련 함수들과 스택 관련 함수들을 이용해 실제로 시작 위치에서 도착 위치까지 도달할 수 있는지 확인하는 함수.<br />
지금은 경로를 출력하고 있지만 이후 미로 만들기에서는 벽을 생성하는 함수로 변경할 예정.<br /></p>

<p>길찾기 함수를 갈 수 있는 좌표를 찾고, 없다면 스택을 이용해 백트래킹으로 돌아와 다시 좌표를 찾을 수 있다.<br />
이 코드를 통해 우리는 시작 위치에서 도착 위치까지의 경로를 찾을 수 있다.</p>

<hr />

<h4 id="벽-생성">벽 생성</h4>

<p>랜덤한 위치에 벽을 생성해야되기 때문에 <code class="language-plaintext highlighter-rouge">rand()</code>함수와 시드값으로 <code class="language-plaintext highlighter-rouge">time()</code> 함수를 쓰기 위해 <code class="language-plaintext highlighter-rouge">#include &lt;stdlib.h&gt;</code>와 <code class="language-plaintext highlighter-rouge">#include &lt;time.h&gt;</code>을 추가하고, 랜덤하게 벽을 생성해주었다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 벽 생성 관련 함수</span>

<span class="c1">// 생성된 벽이 중복인지 확인. 같은 벽이면 1, 아니면 0</span>
<span class="kt">int</span> <span class="nf">check_create_wall</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_wall</span><span class="p">){</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">maze</span><span class="p">[</span><span class="n">_wall</span><span class="p">.</span><span class="n">row</span><span class="p">][</span><span class="n">_wall</span><span class="p">.</span><span class="n">col</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">){</span>
    <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="k">else</span>
  <span class="p">{</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// 랜덤한 위치에 벽을 하나 생성.</span>
<span class="k">struct</span> <span class="n">COORD</span> <span class="nf">create_wall</span><span class="p">(){</span>
  <span class="k">struct</span> <span class="n">COORD</span> <span class="n">wall</span><span class="p">;</span>

  <span class="c1">// 0 ~ size -1 까지 중에 랜덤</span>
  <span class="n">wall</span><span class="p">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">rand</span><span class="p">()</span> <span class="o">%</span> <span class="n">size</span><span class="p">;</span>
  <span class="n">wall</span><span class="p">.</span><span class="n">col</span> <span class="o">=</span> <span class="n">rand</span><span class="p">()</span> <span class="o">%</span> <span class="n">size</span><span class="p">;</span>

  <span class="k">while</span> <span class="p">(</span><span class="mi">1</span><span class="p">)</span>
  <span class="p">{</span> <span class="c1">// 이미 생성된 벽이거나 출발 위치이거나 도착 위치인 경우, 재생성.</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">check_create_wall</span><span class="p">(</span><span class="n">wall</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">||</span> <span class="p">(</span><span class="n">wall</span><span class="p">.</span><span class="n">row</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">wall</span><span class="p">.</span><span class="n">col</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">wall</span><span class="p">.</span><span class="n">row</span> <span class="o">==</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">wall</span><span class="p">.</span><span class="n">col</span> <span class="o">==</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span>
    <span class="p">{</span>
      <span class="n">wall</span><span class="p">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">rand</span><span class="p">()</span> <span class="o">%</span> <span class="n">size</span><span class="p">;</span>
      <span class="n">wall</span><span class="p">.</span><span class="n">col</span> <span class="o">=</span> <span class="n">rand</span><span class="p">()</span> <span class="o">%</span> <span class="n">size</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="k">else</span>
    <span class="p">{</span> <span class="c1">// 벽 생성</span>
      <span class="n">maze</span><span class="p">[</span><span class="n">wall</span><span class="p">.</span><span class="n">row</span><span class="p">][</span><span class="n">wall</span><span class="p">.</span><span class="n">col</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
      <span class="n">wallcount</span><span class="o">++</span><span class="p">;</span>
      <span class="k">break</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>

  <span class="k">return</span> <span class="n">wall</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><strong>벽 생성 관련 함수</strong><br />
<code class="language-plaintext highlighter-rouge">check_create_wall</code>: 벽이 중복인지 아닌지 확인하는 함수.<br />
<code class="language-plaintext highlighter-rouge">create_wall</code>: 랜덤한 위치에 벽을 생성하는 함수.<br /></p>

<hr />

<h4 id="문제점-수정">문제점 수정</h4>

<p>70% 이상의 벽을 생성하는데에 있어. $5 * 5$와 $6 * 6$ 사이즈는 말이 안된다. <br />
$5 * 5$ 의 70%는 $17.5$로 $17.5$ 이상 벽을 세운다면 $18$개 이상을 세워야 한다.<br />
그런데 $5 * 5$일때 최소한의 이동은 가로로 5번 세로로 4번 움직인 9번의 움직임이 필요하다.<br />
$18 + 9$ 는 $27$로 $5 * 5$ 배열의 개수인 25를 넘어버린다.<br />
$6 * 6$ 사이즈의 미로 역시 마찬가지이다.<br />
$6 * 6$ 사이즈의 미로에서 70%는 $25.2$로 $25.2$ 이상의 벽을 세운다면 26개 이상 세워야 한다.<br />
미로의 최소 이동 수는 $6 + 5$로 $11$ 이므로 $26 + 11 \neq 6 * 6$ 이다.<br />
따라서 $5$와 $6$인 경우 미로를 만들 수 없다.<br /><br />
문제를 해결하기 위해 이동을 위한 최소한의 개수를 뺀 $((size * size) - size + size - 1)$만큼의 벽을 세우고,<br />
<code class="language-plaintext highlighter-rouge">failcount</code>를 만들어 $size * size$번(충분히 많은 실패 횟수동안) 경로를 찾지 못하면,<br />
더이상 벽을 세울 수 없기에 “경로를 찾을 수 없습니다.” 메세지를 띄우게 하였다.<br /><br />
7인 경우에도 벽이 확률적으로 경로를 ‘ㄷ’자로 꼬아서 최소 이동횟수로 움직을 수 없는 경우, 70%의 벽 생성이 불가능하다.
<br /> 따라서 충분한 실패가 이어진다면 미로 만들기를 재시작하도록 변경하였다.</p>

<hr />

<h4 id="최종-코드">최종 코드</h4>

<p>아래는 최종코드이다.<br />
통로는 ‘⬜’, 벽은 ‘⬛’, 경로는 ‘▪️’로 표시했다.<br />
이후 0과 1로 된 맵을 보고싶으면 1을, 경로를 보고싶으면 다시 1을 누르면 된다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;time.h&gt;</span><span class="cp">
</span>
<span class="c1">// 좌표 정보를 나타내는 구조체</span>
<span class="k">struct</span> <span class="n">COORD</span><span class="p">{</span>
  <span class="kt">int</span> <span class="n">row</span><span class="p">;</span>
  <span class="kt">int</span> <span class="n">col</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="n">COORD</span> <span class="o">*</span><span class="n">path_stack</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>    <span class="c1">// 스택(경로 저장)</span>
<span class="k">struct</span> <span class="n">COORD</span> <span class="o">*</span><span class="n">visited</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>       <span class="c1">// 방문한 좌표 저장</span>
<span class="kt">int</span> <span class="o">**</span><span class="n">maze</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>                  <span class="c1">// 미로</span>
<span class="kt">int</span> <span class="n">top</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>                       <span class="c1">// path_stack의 top</span>
<span class="kt">int</span> <span class="n">visitedIndex</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>              <span class="c1">// visited의 index</span>
<span class="kt">int</span> <span class="n">size</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>                       <span class="c1">// 미로의 크기 ( size * size )</span>
<span class="kt">int</span> <span class="n">wallcount</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>                  <span class="c1">// 생성된 벽의 수</span>
<span class="kt">int</span> <span class="n">failcount</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>                  <span class="c1">// 5와 6를 걸러내기 위한 경로탐색실패 카운트</span>

<span class="c1">// 스택 관련 함수</span>
<span class="kt">int</span> <span class="nf">isStackEmpty</span><span class="p">(){</span>
  <span class="k">return</span> <span class="p">(</span><span class="n">top</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">isStackFull</span><span class="p">(){</span>
  <span class="k">return</span> <span class="p">(</span><span class="n">top</span> <span class="o">==</span> <span class="p">(</span><span class="n">size</span> <span class="o">*</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">));</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">push</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_c</span><span class="p">){</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">isStackFull</span><span class="p">())</span>
  <span class="p">{</span>
  <span class="k">return</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="n">top</span><span class="o">++</span><span class="p">;</span>
  <span class="n">path_stack</span><span class="p">[</span><span class="n">top</span><span class="p">]</span> <span class="o">=</span> <span class="n">_c</span><span class="p">;</span>
  <span class="k">return</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">struct</span> <span class="n">COORD</span> <span class="nf">pop</span><span class="p">(){</span>

  <span class="k">struct</span> <span class="n">COORD</span> <span class="n">result</span> <span class="o">=</span> <span class="p">{</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span> <span class="p">};</span>

  <span class="k">if</span> <span class="p">(</span><span class="n">isStackEmpty</span><span class="p">())</span>
  <span class="p">{</span>
  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="n">result</span> <span class="o">=</span> <span class="n">path_stack</span><span class="p">[</span><span class="n">top</span><span class="p">];</span>
  <span class="n">top</span><span class="o">--</span><span class="p">;</span>
  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// peek (pop과 유사하지만 실제로 pop은 하지 않고 맨 위의 값을 보기만 함.)</span>
<span class="k">struct</span> <span class="n">COORD</span> <span class="nf">peek</span><span class="p">(){</span>
  <span class="k">struct</span> <span class="n">COORD</span> <span class="n">result</span> <span class="o">=</span> <span class="p">{</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span> <span class="p">};</span>

  <span class="k">if</span> <span class="p">(</span><span class="n">isStackEmpty</span><span class="p">())</span>
  <span class="p">{</span>
  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="n">result</span> <span class="o">=</span> <span class="n">path_stack</span><span class="p">[</span><span class="n">top</span><span class="p">];</span>
  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// 길찾기 관련 함수</span>

<span class="c1">// 좌표 _c를 방문했었는지 판단</span>
<span class="c1">// 했었으면 1 아니면 zero</span>
<span class="kt">int</span> <span class="nf">checkVisited</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_c</span><span class="p">){</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">visitedIndex</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">visited</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">col</span> <span class="o">==</span> <span class="n">_c</span><span class="p">.</span><span class="n">col</span> <span class="o">&amp;&amp;</span> <span class="n">visited</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">row</span> <span class="o">==</span> <span class="n">_c</span><span class="p">.</span><span class="n">row</span><span class="p">)</span>
    <span class="p">{</span>
      <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>

  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">addToVisited</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_c</span><span class="p">){</span>

  <span class="c1">// 있는지를 검사한다.</span>
  <span class="c1">// 없으면 추가한다. 이때 인덱스를 먼저 증가시킨다.</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">checkVisited</span><span class="p">(</span><span class="n">_c</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">){</span>
    <span class="n">visitedIndex</span><span class="o">++</span><span class="p">;</span>
    <span class="n">visited</span><span class="p">[</span><span class="n">visitedIndex</span><span class="p">]</span> <span class="o">=</span> <span class="n">_c</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// _c가 _dst와 같은지 판단.</span>
<span class="c1">// 같으면 non-zero를 반화, 아니면 0을 반환</span>
<span class="kt">int</span> <span class="nf">checkDestination</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_c</span><span class="p">,</span> <span class="k">struct</span> <span class="n">COORD</span> <span class="n">_dst</span><span class="p">){</span>
  <span class="k">return</span> <span class="p">(</span><span class="n">_c</span><span class="p">.</span><span class="n">row</span> <span class="o">==</span> <span class="n">_dst</span><span class="p">.</span><span class="n">row</span> <span class="o">&amp;&amp;</span> <span class="n">_c</span><span class="p">.</span><span class="n">col</span> <span class="o">==</span> <span class="n">_dst</span><span class="p">.</span><span class="n">col</span><span class="p">);</span>
<span class="p">}</span>

<span class="c1">// _c가 영역 내에 있으면 1, 아니면 0</span>
<span class="kt">int</span> <span class="nf">isWithinMap</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_c</span><span class="p">){</span>
  <span class="k">return</span> <span class="p">((</span><span class="n">_c</span><span class="p">.</span><span class="n">row</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">_c</span><span class="p">.</span><span class="n">row</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">_c</span><span class="p">.</span><span class="n">col</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">_c</span><span class="p">.</span><span class="n">col</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">));</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">isWall</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_c</span><span class="p">){</span>
  <span class="k">return</span> <span class="p">(</span><span class="mi">1</span> <span class="o">==</span> <span class="n">maze</span><span class="p">[</span><span class="n">_c</span><span class="p">.</span><span class="n">row</span><span class="p">][</span><span class="n">_c</span><span class="p">.</span><span class="n">col</span><span class="p">]);</span>
<span class="p">}</span>

<span class="c1">// _c를 기준으로 갈 수 있는 좌표 1곳을 반환</span>
<span class="c1">// 만약 없으면 (-1, -1) 반환환</span>
<span class="k">struct</span> <span class="n">COORD</span> <span class="nf">findWhereToGo</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_c</span><span class="p">){</span>

  <span class="c1">// 체크할 방향을 저장하는 변수</span>
  <span class="k">struct</span> <span class="n">COORD</span> <span class="n">target</span><span class="p">;</span>

  <span class="c1">// 1. 지도 영역 내인가?</span>
  <span class="c1">// 2. 벽인가?</span>
  <span class="c1">// 3. 가본 적 있나?</span>

  <span class="c1">// 위</span>
  <span class="n">target</span><span class="p">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">row</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
  <span class="n">target</span><span class="p">.</span><span class="n">col</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">col</span><span class="p">;</span>

  <span class="k">if</span> <span class="p">(</span><span class="n">isWithinMap</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">isWall</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">checkVisited</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="k">return</span> <span class="n">target</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="c1">// 아래</span>
  <span class="n">target</span><span class="p">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">row</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
  <span class="n">target</span><span class="p">.</span><span class="n">col</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">col</span><span class="p">;</span>

  <span class="k">if</span> <span class="p">(</span><span class="n">isWithinMap</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">isWall</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">checkVisited</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="k">return</span> <span class="n">target</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="c1">// 왼쪽</span>
  <span class="n">target</span><span class="p">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">row</span><span class="p">;</span>
  <span class="n">target</span><span class="p">.</span><span class="n">col</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">col</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>

  <span class="k">if</span> <span class="p">(</span><span class="n">isWithinMap</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">isWall</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">checkVisited</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="k">return</span> <span class="n">target</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="c1">// 오른쪽</span>
  <span class="n">target</span><span class="p">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">row</span><span class="p">;</span>
  <span class="n">target</span><span class="p">.</span><span class="n">col</span> <span class="o">=</span> <span class="n">_c</span><span class="p">.</span><span class="n">col</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>

  <span class="k">if</span> <span class="p">(</span><span class="n">isWithinMap</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">isWall</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">checkVisited</span><span class="p">(</span><span class="n">target</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="k">return</span> <span class="n">target</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="n">target</span><span class="p">.</span><span class="n">row</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
  <span class="n">target</span><span class="p">.</span><span class="n">col</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>

  <span class="k">return</span> <span class="n">target</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// _s에서 _d까지 경로를 출력하는 함수</span>
<span class="kt">void</span> <span class="nf">findPath</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_s</span><span class="p">,</span> <span class="k">struct</span> <span class="n">COORD</span> <span class="n">_d</span><span class="p">,</span> <span class="k">struct</span> <span class="n">COORD</span> <span class="n">_wall</span><span class="p">){</span>

  <span class="c1">// 현재 위치를 설정</span>
  <span class="k">struct</span> <span class="n">COORD</span> <span class="n">current</span> <span class="o">=</span> <span class="n">_s</span><span class="p">;</span>

  <span class="c1">// 출발 좌표 저장</span>
  <span class="n">addToVisited</span><span class="p">(</span><span class="n">current</span><span class="p">);</span>

  <span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="c1">// 현재 위치에서 가는 곳을 찾는다.</span>
    <span class="k">struct</span> <span class="n">COORD</span> <span class="n">whereToGO</span> <span class="o">=</span> <span class="n">findWhereToGo</span><span class="p">(</span><span class="n">current</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">whereToGO</span><span class="p">.</span><span class="n">row</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">whereToGO</span><span class="p">.</span><span class="n">col</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
    <span class="p">{</span>   <span class="c1">// 갈 곳이 있음</span>
      <span class="n">push</span><span class="p">(</span><span class="n">current</span><span class="p">);</span>  <span class="c1">// 경로를 저장해 둔다.</span>
      <span class="n">current</span> <span class="o">=</span> <span class="n">whereToGO</span><span class="p">;</span>

      <span class="n">addToVisited</span><span class="p">(</span><span class="n">current</span><span class="p">);</span>

      <span class="k">if</span> <span class="p">(</span><span class="n">checkDestination</span><span class="p">(</span><span class="n">current</span><span class="p">,</span> <span class="n">_d</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
      <span class="p">{</span>
        <span class="c1">// 도착.</span>
        <span class="k">return</span><span class="p">;</span>
      <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">else</span>
    <span class="p">{</span>   <span class="c1">// 갈 곳이 없음</span>
      <span class="k">while</span> <span class="p">(</span><span class="mi">1</span><span class="p">)</span>
      <span class="p">{</span>
        <span class="c1">// top_coord &lt;= stack의 맨 위에 있는 곳을 peek</span>
        <span class="k">struct</span> <span class="n">COORD</span> <span class="n">top_coord</span> <span class="o">=</span> <span class="n">peek</span><span class="p">();</span>

        <span class="c1">// top_coord (-1, -1) : stack이 비었음... 경로 없음</span>
        <span class="c1">// 더 이상 돌아갈 곳이 없음. 프로그램 종료.</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">top_coord</span><span class="p">.</span><span class="n">row</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">top_coord</span><span class="p">.</span><span class="n">col</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
       <span class="p">{</span>
          <span class="n">maze</span><span class="p">[</span><span class="n">_wall</span><span class="p">.</span><span class="n">row</span><span class="p">][</span><span class="n">_wall</span><span class="p">.</span><span class="n">col</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>   <span class="c1">// 벽 지우기</span>
          <span class="n">wallcount</span><span class="o">--</span><span class="p">;</span>
          <span class="n">failcount</span><span class="o">++</span><span class="p">;</span>  <span class="c1">// 실패 카운트</span>
          <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="n">whereToGO</span> <span class="o">=</span> <span class="n">findWhereToGo</span><span class="p">(</span><span class="n">top_coord</span><span class="p">);</span>

       <span class="k">if</span> <span class="p">(</span><span class="n">whereToGO</span><span class="p">.</span><span class="n">row</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">whereToGO</span><span class="p">.</span><span class="n">col</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
       <span class="p">{</span>
          <span class="c1">// findWhereToGo(top_coord) =&gt; (-1, -1)</span>
          <span class="c1">// 이 좌표는 도움이 안됨. 더 이전으로 가야함. 이 좌표는 버림</span>
          <span class="n">pop</span><span class="p">();</span>  <span class="c1">// top_coord를 날려버림.</span>
        <span class="p">}</span>
        <span class="k">else</span>
        <span class="p">{</span>
          <span class="c1">// findWhereToGo(top_coord) =&gt; 유효한 좌표 찾기 성공</span>
          <span class="c1">// current = whereToGo</span>
          <span class="c1">// push가 필요 없음, 아직 top_coord가 스택에 존재하기 때문.</span>
          <span class="c1">// addToVisited(current)</span>
          <span class="n">current</span> <span class="o">=</span> <span class="n">whereToGO</span><span class="p">;</span>
          <span class="n">addToVisited</span><span class="p">(</span><span class="n">current</span><span class="p">);</span>
          <span class="k">break</span><span class="p">;</span>
        <span class="p">}</span>
      <span class="p">}</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// 벽 생성 관련 함수</span>

<span class="c1">// 생성된 벽이 중복인지 확인. 같은 벽이면 1, 아니면 0</span>
<span class="kt">int</span> <span class="nf">check_create_wall</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_wall</span><span class="p">){</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">maze</span><span class="p">[</span><span class="n">_wall</span><span class="p">.</span><span class="n">row</span><span class="p">][</span><span class="n">_wall</span><span class="p">.</span><span class="n">col</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">){</span>
    <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="k">else</span>
  <span class="p">{</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// 랜덤한 위치에 벽을 하나 생성.</span>
<span class="k">struct</span> <span class="n">COORD</span> <span class="nf">create_wall</span><span class="p">(){</span>
  <span class="k">struct</span> <span class="n">COORD</span> <span class="n">wall</span><span class="p">;</span>

  <span class="c1">// 0 ~ size -1 까지 중에 랜덤</span>
  <span class="n">wall</span><span class="p">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">rand</span><span class="p">()</span> <span class="o">%</span> <span class="n">size</span><span class="p">;</span>
  <span class="n">wall</span><span class="p">.</span><span class="n">col</span> <span class="o">=</span> <span class="n">rand</span><span class="p">()</span> <span class="o">%</span> <span class="n">size</span><span class="p">;</span>

  <span class="k">while</span> <span class="p">(</span><span class="mi">1</span><span class="p">)</span>
  <span class="p">{</span> <span class="c1">// 이미 생성된 벽이거나 출발 위치이거나 도착 위치인 경우, 재생성.</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">check_create_wall</span><span class="p">(</span><span class="n">wall</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">||</span> <span class="p">(</span><span class="n">wall</span><span class="p">.</span><span class="n">row</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">wall</span><span class="p">.</span><span class="n">col</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">wall</span><span class="p">.</span><span class="n">row</span> <span class="o">==</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">wall</span><span class="p">.</span><span class="n">col</span> <span class="o">==</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span>
    <span class="p">{</span>
      <span class="n">wall</span><span class="p">.</span><span class="n">row</span> <span class="o">=</span> <span class="n">rand</span><span class="p">()</span> <span class="o">%</span> <span class="n">size</span><span class="p">;</span>
      <span class="n">wall</span><span class="p">.</span><span class="n">col</span> <span class="o">=</span> <span class="n">rand</span><span class="p">()</span> <span class="o">%</span> <span class="n">size</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="k">else</span>
    <span class="p">{</span> <span class="c1">// 벽 생성</span>
      <span class="n">maze</span><span class="p">[</span><span class="n">wall</span><span class="p">.</span><span class="n">row</span><span class="p">][</span><span class="n">wall</span><span class="p">.</span><span class="n">col</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
      <span class="n">wallcount</span><span class="o">++</span><span class="p">;</span>
      <span class="k">break</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>

  <span class="k">return</span> <span class="n">wall</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// 미로 보여주기</span>
<span class="kt">void</span> <span class="nf">show_maze</span><span class="p">(){</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
    <span class="p">{</span>
      <span class="k">if</span> <span class="p">(</span><span class="n">maze</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
      <span class="p">{</span> <span class="c1">// 벽 그리기.</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"⬛"</span><span class="p">);</span>
      <span class="p">}</span>
      <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">maze</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
      <span class="p">{</span> <span class="c1">// 통로 그리기.</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"⬜"</span><span class="p">);</span>
      <span class="p">}</span>
      <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">maze</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span>
      <span class="p">{</span> <span class="c1">// 경로 그리기.</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"▪️"</span><span class="p">);</span>
      <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>

  <span class="k">return</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// 0과 1로 미로 보여주기</span>
<span class="kt">void</span> <span class="nf">show_bit_maze</span><span class="p">(){</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
    <span class="p">{</span>
      <span class="n">printf</span><span class="p">(</span><span class="s">"%d "</span><span class="p">,</span> <span class="n">maze</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]);</span>
    <span class="p">}</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>

  <span class="k">return</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// 경로 보여주기</span>
<span class="kt">void</span> <span class="nf">show_path</span><span class="p">(){</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">top</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
    <span class="p">{</span> <span class="c1">// 경로를 3으로 표시</span>
      <span class="n">maze</span><span class="p">[</span><span class="n">path_stack</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">row</span><span class="p">][</span><span class="n">path_stack</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">col</span><span class="p">]</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
    <span class="p">}</span>

  <span class="n">show_maze</span><span class="p">();</span>

  <span class="k">return</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// 미로 만들기</span>
<span class="kt">int</span> <span class="nf">create_maze</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="n">_s</span><span class="p">,</span> <span class="k">struct</span> <span class="n">COORD</span> <span class="n">_d</span><span class="p">){</span>

    <span class="k">while</span> <span class="p">((</span><span class="n">size</span> <span class="o">*</span> <span class="n">size</span> <span class="o">*</span> <span class="mi">7</span><span class="p">)</span> <span class="o">/</span> <span class="mi">10</span> <span class="o">&gt;=</span> <span class="n">wallcount</span><span class="p">)</span>
    <span class="p">{</span>
    <span class="c1">// 스택, 배열 초기화</span>
    <span class="n">top</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
    <span class="n">visitedIndex</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>

    <span class="k">struct</span> <span class="n">COORD</span> <span class="n">wall</span> <span class="o">=</span> <span class="n">create_wall</span><span class="p">();</span>
    <span class="n">findPath</span><span class="p">(</span><span class="n">_s</span><span class="p">,</span> <span class="n">_d</span><span class="p">,</span> <span class="n">wall</span><span class="p">);</span>

    <span class="c1">// 최소이동횟수( size + size - 1 )을 제외한 벽의 최대수를 충족하고 충분히 많이 실패한 경우.</span>
    <span class="c1">// 조건을 충족하는 미로를 만들 수 없는 경우.</span>
    <span class="k">if</span> <span class="p">((</span><span class="n">failcount</span> <span class="o">&gt;</span> <span class="n">size</span> <span class="o">*</span> <span class="n">size</span> <span class="o">*</span> <span class="n">size</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">wallcount</span> <span class="o">==</span> <span class="p">(</span><span class="n">size</span> <span class="o">*</span> <span class="n">size</span><span class="p">)</span> <span class="o">-</span> <span class="p">(</span><span class="n">size</span> <span class="o">+</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)))</span>
    <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"경로를 찾을 수 없습니다.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"미로를 완성할 수 없습니다.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">else</span> <span class="k">if</span> <span class="p">((</span><span class="n">failcount</span> <span class="o">&gt;</span> <span class="n">size</span> <span class="o">*</span> <span class="n">size</span> <span class="o">*</span> <span class="n">size</span><span class="p">))</span>
    <span class="p">{</span> <span class="c1">// 7이나 8인 경우, 경로가 'ㄷ'라 처럼 꼬여서 최소 이동횟수로 움직이지 않는 경우.</span>
      <span class="c1">// 최소 이동 횟수가 아니면 7일 때, 70%의 벽이 생성될 수 없음. 재생성.</span>
      <span class="c1">// 미로 초기화 모두 0으로</span>
      <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
      <span class="p">{</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
        <span class="p">{</span>
          <span class="n">maze</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="p">}</span>
      <span class="p">}</span>
      <span class="n">failcount</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
      <span class="n">wallcount</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
      <span class="n">printf</span><span class="p">(</span><span class="s">"경로를 재탐색합니다.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
  <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

  <span class="n">printf</span><span class="p">(</span><span class="s">"미로의 크기를 정해주세요.(n &gt;= 5, n &lt;= 30)</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
  <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">size</span><span class="p">);</span>

  <span class="c1">// 입력 크기 제한</span>
  <span class="k">while</span> <span class="p">(</span><span class="n">size</span> <span class="o">&lt;</span> <span class="mi">5</span> <span class="o">||</span> <span class="n">size</span> <span class="o">&gt;</span> <span class="mi">30</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"잘못된 크기입니다.(n &gt;= 5, n &lt;= 30)</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"미로의 크기를 정해주세요.(n &gt;= 5, n &lt;= 30)</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">size</span><span class="p">);</span>
  <span class="p">}</span>

  <span class="k">struct</span> <span class="n">COORD</span> <span class="n">start_point</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span> <span class="p">};</span>                <span class="c1">// 시작지점</span>
  <span class="k">struct</span> <span class="n">COORD</span> <span class="n">dest_point</span> <span class="o">=</span> <span class="p">{</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">size</span> <span class="o">-</span><span class="mi">1</span> <span class="p">};</span>    <span class="c1">// 종료지점</span>

  <span class="c1">// 미로와 문제풀이에 사용할 스택과 배열 동적할당.</span>
  <span class="n">maze</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span> <span class="o">**</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="n">size</span> <span class="o">*</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="p">));</span>

  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="n">maze</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="n">size</span> <span class="o">*</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">));</span>
  <span class="p">}</span>

  <span class="n">path_stack</span> <span class="o">=</span> <span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="n">size</span> <span class="o">*</span> <span class="n">size</span> <span class="o">*</span> <span class="k">sizeof</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span><span class="p">));</span>
  <span class="n">visited</span> <span class="o">=</span> <span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span> <span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="n">size</span> <span class="o">*</span> <span class="n">size</span> <span class="o">*</span> <span class="k">sizeof</span><span class="p">(</span><span class="k">struct</span> <span class="n">COORD</span><span class="p">));</span>

  <span class="c1">// 랜덤 시드 값</span>
  <span class="n">srand</span><span class="p">(</span><span class="n">time</span><span class="p">(</span><span class="nb">NULL</span><span class="p">));</span>

  <span class="c1">// 미로 초기화 모두 0으로</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
    <span class="p">{</span>
      <span class="n">maze</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>

  <span class="c1">// 미로 생성</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">create_maze</span><span class="p">(</span><span class="n">start_point</span><span class="p">,</span> <span class="n">dest_point</span><span class="p">))</span>
  <span class="p">{</span> <span class="c1">// 성공!</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"(%d * %d)사이즈의 미로</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
    <span class="n">show_maze</span><span class="p">();</span>

    <span class="c1">// 벽 생성 % 출력</span>
    <span class="kt">double</span> <span class="n">num</span> <span class="o">=</span> <span class="p">((</span><span class="kt">double</span><span class="p">)</span><span class="n">wallcount</span> <span class="o">/</span> <span class="p">(</span><span class="n">size</span> <span class="o">*</span> <span class="n">size</span><span class="p">))</span> <span class="o">*</span> <span class="mi">100</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"벽 생성: %.2f \%</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">num</span><span class="p">);</span>

    <span class="c1">// 경로 출력</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">top</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
    <span class="p">{</span>
      <span class="n">printf</span><span class="p">(</span><span class="s">"( %d, %d )-&gt;</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">path_stack</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">row</span><span class="p">,</span> <span class="n">path_stack</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">col</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"( %d, %d ) 도착!</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"0과 1로 된 미로를 보고싶다면 1을, 아니라면 2를 눌러주세요..</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
    <span class="p">{</span>
      <span class="n">printf</span><span class="p">(</span><span class="s">"0과 1로 이루어진 미로</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
      <span class="n">show_bit_maze</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"경로를 보고 싶다면 1을 종료는 2를 눌러주세요.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
    <span class="p">{</span>
      <span class="n">show_path</span><span class="p">();</span>
    <span class="p">}</span>
  <span class="p">}</span>
  <span class="k">else</span>
  <span class="p">{</span> <span class="c1">// 실패</span>
    <span class="n">show_maze</span><span class="p">();</span>
    
    <span class="c1">// 벽 생성 % 출력</span>
    <span class="kt">double</span> <span class="n">num</span> <span class="o">=</span> <span class="p">((</span><span class="kt">double</span><span class="p">)</span><span class="n">wallcount</span> <span class="o">/</span> <span class="p">(</span><span class="n">size</span> <span class="o">*</span> <span class="n">size</span><span class="p">))</span> <span class="o">*</span> <span class="mi">100</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"벽 생성: %.2f \%</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">num</span><span class="p">);</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"현재 미로에서 더 이상 벽을 추가할 수 없습니다.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
  <span class="p">}</span>

  <span class="n">printf</span><span class="p">(</span><span class="s">"아무 버튼을 입력해 종료해주세요.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
  <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">);</span>

  <span class="c1">// 동적할당 해제</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="n">free</span><span class="p">(</span><span class="n">maze</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
  <span class="p">}</span>
  <span class="n">free</span><span class="p">(</span><span class="n">maze</span><span class="p">);</span>

  <span class="n">free</span><span class="p">(</span><span class="n">path_stack</span><span class="p">);</span>
  <span class="n">free</span><span class="p">(</span><span class="n">visited</span><span class="p">);</span>

  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<hr />

<h4 id="동작-화면">동작 화면</h4>
<p>초기화면(입력 대기)</p>

<p><img src="../images/2025-03-25-12-32-57.png" alt="" /></p>

<p>잘못된 입력을 받은 경우</p>

<p><img src="../images/2025-03-25-12-36-05.png" alt="" /></p>

<p>제대로 된 입력을 받은 경우(size = 7)</p>

<p><img src="../images/2025-03-25-12-36-52.png" alt="" /></p>

<p>제대로 된 입력이지만 5나 6인 경우(size = 5)</p>

<p><img src="../images/2025-03-25-12-39-53.png" alt="" /></p>

<p>0과 1로 이루어진 미로를 보고 싶은 경우( size = 7 )</p>

<p><img src="../images/2025-03-25-12-39-10.png" alt="" /></p>

<p>경로를 보고 싶은 경우(size = 30)</p>

<p><img src="../images/2025-03-25-12-40-42.png" alt="" /></p>]]></content><author><name>Park SangWon</name></author><category term="DataStructure" /><summary type="html"><![CDATA[Data Structure 4장 스택, 미로찾기, 미로만들기]]></summary></entry><entry><title type="html">Chapter 3 구조체, 배열, 포인터</title><link href="https://ssangwonpark.github.io/Chapter3/" rel="alternate" type="text/html" title="Chapter 3 구조체, 배열, 포인터" /><published>2025-03-13T00:00:00+00:00</published><updated>2025-03-13T00:00:00+00:00</updated><id>https://ssangwonpark.github.io/Chapter3</id><content type="html" xml:base="https://ssangwonpark.github.io/Chapter3/"><![CDATA[<h2 id="구조체">구조체</h2>

<h3 id="구조체란-사용자가-원하는-자료형들을-모아-새롭게-데이터-타입을-만들-수-있다-">구조체란, 사용자가 원하는 자료형들을 모아 새롭게 데이터 타입을 만들 수 있다. <br /></h3>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">struct</span> <span class="n">Person</span> <span class="p">{</span>
    <span class="kt">char</span> <span class="n">name</span><span class="p">[</span><span class="mi">10</span><span class="p">];</span>
    <span class="kt">int</span> <span class="n">age</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
    <span class="k">struct</span> <span class="n">Person</span> <span class="n">p1</span><span class="p">;</span>

    <span class="n">retrun</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>같은 자료형만 사용가능한 배열과 다르게 서로 다른 자료형들을 모아 사용할 수 있다. <br />
그러나 이런 식의 구조체는 이후 선언 시, struct (구조체 이름)으로 길게 작성해야 한다. <br />
짧게 P로만 작성할 수는 없을까? 우리의 손목 건강을 위해 typedef가 존재한다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">typedef</span> <span class="k">struct</span> <span class="p">{</span>
    <span class="kt">char</span> <span class="n">name</span><span class="p">[</span><span class="mi">10</span><span class="p">];</span>
    <span class="kt">int</span> <span class="n">age</span><span class="p">;</span>
<span class="p">}</span> <span class="n">Person</span><span class="p">;</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
    <span class="n">Person</span> <span class="n">p1</span><span class="p">;</span>

    <span class="n">retrun</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>이렇게 typedef를 통해 선언하면 다시 이름을 지어주어 짧고, 가독성 좋게 작성 가능하다.</p>

<h2 id="배열">배열</h2>

<h3 id="배열이란-같은-자료형을-순차적으로-나타낼-수-있는-자료형이다-">배열이란, 같은 자료형을 순차적으로 나타낼 수 있는 자료형이다. <br /></h3>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">a</span><span class="p">[</span><span class="mi">10</span><span class="p">];</span>
</code></pre></div></div>

<blockquote>
  <p>이때, a는 0부터 9까지의 인덱스 번호를 가진다. a[0] ~ a[9]</p>
</blockquote>

<h3 id="1차원-배열의-활용">1차원 배열의 활용</h3>

<p>배열은 문제해결에 있어 굉장히 유용하게 사용 가능하다.<br />
아래는 배열을 이용한 다항식 연산과 행렬 계산이다.</p>

<h4 id="다항식">다항식</h4>

<p>배열을 이용해 다항식을 정의하는 경우, 두가지 형태로 나타낼 수 있다. <br />
먼저 배열에 계수를 저장하고 차수는 배열의 인덱스 번호를 이용하는 코드이다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="k">struct</span> <span class="n">POLY</span><span class="p">{</span>
    <span class="kt">int</span> <span class="n">max_degree</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">coef</span><span class="p">[</span><span class="mi">100</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span><span class="p">,</span> <span class="p">};</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
    <span class="c1">// 2x^2 + 3x + 1</span>
    <span class="k">struct</span> <span class="n">POLY</span> <span class="n">p1</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">2</span><span class="p">,</span> <span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">}</span> <span class="p">};</span>

    <span class="n">retrun</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>배열의 최대차수와 계수만 순서대로 적으면 다항식을 표현할 수 있다. <br />
그러나 이런 식의 다항식은 좀 아쉬운 부분이 존재한다.<br />
바로 $x^9 + 1$같은 경우, 8차부터 2차항까지 모두 계수가 $0$으로 값이 필요없지만, 배열의 인덱스 번호를 이용하기 위해 배열의 크기를 10으로 만들어야 한다는 점이다.<br />
계수가 커지고, 중간의 계수가 없을수록 메모리적으로 낭비가 심한 방법이다.<br />
이를 해결하는 방법은 차수와 계수를 모두 저장하는 방법이다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="k">struct</span> <span class="n">TERM</span>
<span class="p">{</span>
    <span class="kt">int</span> <span class="n">coef</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">degree</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="n">ePOLY</span><span class="p">{</span>
    <span class="kt">int</span> <span class="n">valid_num</span><span class="p">;</span>
    <span class="k">struct</span> <span class="n">TERM</span> <span class="n">terms</span><span class="p">[</span><span class="mi">100</span><span class="p">];</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
    <span class="c1">// 2x^3 + 3x + 1</span>
    <span class="k">struct</span> <span class="n">ePOLY</span> <span class="n">p3</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">3</span><span class="p">,</span> <span class="p">{</span> <span class="p">{</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">},</span> <span class="p">{</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">},</span> <span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">}</span> <span class="p">}</span> <span class="p">};</span>

    <span class="n">retrun</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>이 방법의 경우, 계수의 최대값과 각 항의 계수와 차수를 적어주면 사용가능하다.<br />
고려해야 할 부분이 하나 더 생기지만 더이상 메모리를 낭비하지 않고, 차수만큼의 배열만 만들어주면 된다.<br /><br />
이제 배열을 이용해 다항식을 계산해 보자.</p>

<h4 id="계수와-배열의-인데스를-이용한-다항식">계수와 배열의 인데스를 이용한 다항식</h4>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="c1">// 차수와 배열을 이용한 다항식</span>
<span class="k">struct</span> <span class="n">POLY</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">max_degree</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">coef</span><span class="p">[</span><span class="mi">100</span><span class="p">];</span>
<span class="p">};</span>

<span class="c1">// 다항식 출력</span>
<span class="kt">void</span> <span class="nf">showPolynomoal</span><span class="p">(</span><span class="k">struct</span> <span class="n">POLY</span> <span class="n">_p</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">first</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">_p</span><span class="p">.</span><span class="n">max_degree</span><span class="p">;</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">_p</span><span class="p">.</span><span class="n">coef</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">first</span><span class="p">)</span> <span class="n">printf</span><span class="p">(</span><span class="s">" + "</span><span class="p">);</span>
            <span class="n">printf</span><span class="p">(</span><span class="s">"%d*x^%d"</span><span class="p">,</span> <span class="n">_p</span><span class="p">.</span><span class="n">coef</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">i</span><span class="p">);</span>
            <span class="n">first</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">first</span><span class="p">)</span> <span class="n">printf</span><span class="p">(</span><span class="s">"0"</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
<span class="p">}</span>

<span class="c1">// 다항식의 덧셈</span>
<span class="k">struct</span> <span class="n">POLY</span> <span class="nf">addPoly</span><span class="p">(</span><span class="k">struct</span> <span class="n">POLY</span> <span class="n">_p1</span><span class="p">,</span> <span class="k">struct</span> <span class="n">POLY</span> <span class="n">_p2</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">max</span> <span class="o">=</span> <span class="p">(</span><span class="n">_p1</span><span class="p">.</span><span class="n">max_degree</span> <span class="o">&gt;</span> <span class="n">_p2</span><span class="p">.</span><span class="n">max_degree</span><span class="p">)</span> <span class="o">?</span> <span class="n">_p1</span><span class="p">.</span><span class="n">max_degree</span> <span class="o">:</span> <span class="n">_p2</span><span class="p">.</span><span class="n">max_degree</span><span class="p">;</span>
    <span class="k">struct</span> <span class="n">POLY</span> <span class="n">temp</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="p">};</span>
    <span class="n">temp</span><span class="p">.</span><span class="n">max_degree</span> <span class="o">=</span> <span class="n">max</span><span class="p">;</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">max</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">coef1</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span> <span class="o">&lt;=</span> <span class="n">_p1</span><span class="p">.</span><span class="n">max_degree</span><span class="p">)</span> <span class="o">?</span> <span class="n">_p1</span><span class="p">.</span><span class="n">coef</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">coef2</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span> <span class="o">&lt;=</span> <span class="n">_p2</span><span class="p">.</span><span class="n">max_degree</span><span class="p">)</span> <span class="o">?</span> <span class="n">_p2</span><span class="p">.</span><span class="n">coef</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
        <span class="n">temp</span><span class="p">.</span><span class="n">coef</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">coef1</span> <span class="o">+</span> <span class="n">coef2</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="n">temp</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// 다항식 p1, p2를 입력받아 덧셈 실행</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">struct</span> <span class="n">POLY</span> <span class="n">p1</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="p">};</span>
    <span class="k">struct</span> <span class="n">POLY</span> <span class="n">p2</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="p">};</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"p1의 최대 차수: "</span><span class="p">);</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">p1</span><span class="p">.</span><span class="n">max_degree</span><span class="p">);</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"p2의 최대 차수: "</span><span class="p">);</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">p2</span><span class="p">.</span><span class="n">max_degree</span><span class="p">);</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">p1</span><span class="p">.</span><span class="n">max_degree</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"p1의 %d항의 계수: "</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span>
        <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">p1</span><span class="p">.</span><span class="n">coef</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
    <span class="p">}</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">p2</span><span class="p">.</span><span class="n">max_degree</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"p2의 %d항의 계수: "</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span>
        <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">p2</span><span class="p">.</span><span class="n">coef</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
    <span class="p">}</span>

    <span class="k">struct</span> <span class="n">POLY</span> <span class="n">p3</span> <span class="o">=</span> <span class="n">addPoly</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">);</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">p1: "</span><span class="p">);</span>
    <span class="n">showPolynomoal</span><span class="p">(</span><span class="n">p1</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"p2: "</span><span class="p">);</span>
    <span class="n">showPolynomoal</span><span class="p">(</span><span class="n">p2</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"p1 + p2: "</span><span class="p">);</span>
    <span class="n">showPolynomoal</span><span class="p">(</span><span class="n">p3</span><span class="p">);</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h4 id="차수와-계수를-저장하는-다항식">차수와 계수를 저장하는 다항식</h4>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="c1">// 다항식 중 항 하나의 계수와 차수</span>
<span class="k">struct</span> <span class="n">TERM</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">coef</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">degree</span><span class="p">;</span>
<span class="p">};</span>

<span class="c1">// 다항식 (유효한 항 개수 + TERM 배열)</span>
<span class="k">struct</span> <span class="n">ePOLY</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">valid_num</span><span class="p">;</span>
    <span class="k">struct</span> <span class="n">TERM</span> <span class="n">terms</span><span class="p">[</span><span class="mi">100</span><span class="p">];</span>
<span class="p">};</span>

<span class="c1">// 다항식 출력</span>
<span class="kt">void</span> <span class="nf">showEfficientPoly</span><span class="p">(</span><span class="k">struct</span> <span class="n">ePOLY</span> <span class="n">_p</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">_p</span><span class="p">.</span><span class="n">valid_num</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">printf</span><span class="p">(</span><span class="s">" + "</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">_p</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">degree</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">printf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="n">_p</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">coef</span><span class="p">);</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="n">printf</span><span class="p">(</span><span class="s">"%d*x^%d"</span><span class="p">,</span> <span class="n">_p</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">coef</span><span class="p">,</span> <span class="n">_p</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">degree</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
<span class="p">}</span>

<span class="c1">// 다항식의 덧셈</span>
<span class="k">struct</span> <span class="n">ePOLY</span> <span class="nf">addEfficientPoly</span><span class="p">(</span><span class="k">struct</span> <span class="n">ePOLY</span> <span class="n">_p1</span><span class="p">,</span> <span class="k">struct</span> <span class="n">ePOLY</span> <span class="n">_p2</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">struct</span> <span class="n">ePOLY</span> <span class="n">temp</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span><span class="p">,</span> <span class="p">};</span>

    <span class="k">while</span> <span class="p">(</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">_p1</span><span class="p">.</span><span class="n">valid_num</span> <span class="o">&amp;&amp;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">_p2</span><span class="p">.</span><span class="n">valid_num</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">_p1</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">degree</span> <span class="o">&gt;</span> <span class="n">_p2</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">j</span><span class="p">].</span><span class="n">degree</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">temp</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">count</span><span class="p">]</span> <span class="o">=</span> <span class="n">_p1</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
            <span class="n">i</span><span class="o">++</span><span class="p">;</span>
        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">_p1</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">degree</span> <span class="o">&lt;</span> <span class="n">_p2</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">j</span><span class="p">].</span><span class="n">degree</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">temp</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">count</span><span class="p">]</span> <span class="o">=</span> <span class="n">_p2</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">j</span><span class="p">];</span>
            <span class="n">j</span><span class="o">++</span><span class="p">;</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="n">temp</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">count</span><span class="p">].</span><span class="n">degree</span> <span class="o">=</span> <span class="n">_p1</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">degree</span><span class="p">;</span>
            <span class="n">temp</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">count</span><span class="p">].</span><span class="n">coef</span> <span class="o">=</span> <span class="n">_p1</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">coef</span> <span class="o">+</span> <span class="n">_p2</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">j</span><span class="p">].</span><span class="n">coef</span><span class="p">;</span>
            <span class="n">i</span><span class="o">++</span><span class="p">,</span> <span class="n">j</span><span class="o">++</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">count</span><span class="o">++</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">while</span> <span class="p">(</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">_p1</span><span class="p">.</span><span class="n">valid_num</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">temp</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">count</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="n">_p1</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">i</span><span class="o">++</span><span class="p">];</span>
    <span class="p">}</span>
    <span class="k">while</span> <span class="p">(</span><span class="n">j</span> <span class="o">&lt;</span> <span class="n">_p2</span><span class="p">.</span><span class="n">valid_num</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">temp</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">count</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="n">_p2</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">j</span><span class="o">++</span><span class="p">];</span>
    <span class="p">}</span>

    <span class="n">temp</span><span class="p">.</span><span class="n">valid_num</span> <span class="o">=</span> <span class="n">count</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">temp</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// 다항식 p1, p2를 입력받아 덧셈 실행</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">struct</span> <span class="n">ePOLY</span> <span class="n">p1</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span><span class="p">,</span> <span class="p">};</span>
    <span class="k">struct</span> <span class="n">ePOLY</span> <span class="n">p2</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span><span class="p">,</span> <span class="p">};</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"p1의 항의 개수: "</span><span class="p">);</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">p1</span><span class="p">.</span><span class="n">valid_num</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"p2의 항의 개수: "</span><span class="p">);</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">p2</span><span class="p">.</span><span class="n">valid_num</span><span class="p">);</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">p1</span><span class="p">.</span><span class="n">valid_num</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"p1의 %d번째 항의 계수와 차수: "</span><span class="p">,</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
        <span class="n">scanf</span><span class="p">(</span><span class="s">"%d %d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">p1</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">coef</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">p1</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">degree</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">p2</span><span class="p">.</span><span class="n">valid_num</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"p2의 %d번째 항의 계수와 차수: "</span><span class="p">,</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
        <span class="n">scanf</span><span class="p">(</span><span class="s">"%d %d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">p2</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">coef</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">p2</span><span class="p">.</span><span class="n">terms</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">degree</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">struct</span> <span class="n">ePOLY</span> <span class="n">p3</span> <span class="o">=</span> <span class="n">addEfficientPoly</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">);</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">p1: "</span><span class="p">);</span>
    <span class="n">showEfficientPoly</span><span class="p">(</span><span class="n">p1</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"p2: "</span><span class="p">);</span>
    <span class="n">showEfficientPoly</span><span class="p">(</span><span class="n">p2</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"p1 + p2: "</span><span class="p">);</span>
    <span class="n">showEfficientPoly</span><span class="p">(</span><span class="n">p3</span><span class="p">);</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="2차원-배열의-활용">2차원 배열의 활용</h3>

<p>2차원 배열은 우리가 흔히 생각하는 행렬을 수행하기 좋다.<br />
아래는 2차원 배열을 이용한 행렬의 표현 방법이다.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>행렬 코드 추가
</code></pre></div></div>

<p>그러나 이러한 방법은 희소행렬를 구하는 데에 있어 메모리를 낭비시킨다.</p>

<blockquote>
  <p>희소행렬(sparse matrix) : 대부분의 항들이 0인 배열</p>
</blockquote>

<p>희소행렬의 항 중 유효한 부분만 가져와 행렬을 작성해 보자.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>행렬 코드 추가
</code></pre></div></div>

<p>이제 2차원 배열을 이용한 행렬들로 여러가지 행렬의 연산을 수행할 수 있다.<br />
아래는 행렬의 전치에 대해 코드이다.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>전치 행렬 코드
</code></pre></div></div>

<h2 id="포인터">포인터</h2>

<h3 id="포인터란-데이터-타입의-일종으로-값을-담는-다른-자료형들과-다르게-주소를-담는-자료형이다">포인터란, 데이터 타입의 일종으로 값을 담는 다른 자료형들과 다르게 주소를 담는 자료형이다.</h3>

<h4 id="연산자">*연산자<br /></h4>

<blockquote>
  <p>대입연산자(=)를 기준으로 오른쪽은 주소의 값을 가져온다.<br />
대입연산자(=)를 기준으로 왼쪽은 그 주소에 값을 넣는다.<br /></p>
</blockquote>

<h3 id="동적-할당">동적 할당</h3>

<p>c에서 배열을 통해 데이터를 저장해야 하는 경우, 우리는 초기에 배열에 들어갈 최대치만큼 배열을 선언해주어야 한다.<br />
그러나 최대가 100인 배열에 10만 넣는 경우, 메모리를 비효율적으로 쓴다는 생각이 든다. <br />
이럴 때 사용할 수 있는게 바로 동적 할당이다.<br /><br />
동적 할당은 실행 시간 동안 사용할 메모리 공간을 할당받는 것을 의미한다.<br />
프로그램이 실행하는 순간, 그 순간 필요한 메모리의 양만큼 할당받아 보다 효율적인 메모리 활용이 가능하다.<br />
사용법은 다음 코드와 같다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="c1"> // malloc, free 동적 할당을 위해 필요한 헤더파일</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>

    <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">);</span>

    <span class="c1">// num은 자료형의 크기 * 필요한 배열의 사이즈의 메모리를 할당</span>
    <span class="kt">int</span> <span class="o">*</span><span class="n">num</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span> <span class="o">*</span> <span class="n">n</span><span class="p">);</span>

    <span class="c1">// 동적 할당 해제, 반드시 필요, 생략 시 메모리 누수 가능성 존재.</span>
    <span class="n">free</span><span class="p">(</span><span class="n">num</span><span class="p">);</span>

    <span class="n">retrun</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">&lt;stdlib.h&gt;</code> 라는 헤더 파일을 추가하고, <code class="language-plaintext highlighter-rouge">malloc</code> 함수를 통해 동적 할당이 가능하다.<br />
<code class="language-plaintext highlighter-rouge">void* malloc(size_t size)</code></p>]]></content><author><name>Park SangWon</name></author><category term="DataStructure" /><summary type="html"><![CDATA[Data Structure 3장 배열, 구조체, 포인터]]></summary></entry><entry><title type="html">Chapter 2 순환(Recursion)</title><link href="https://ssangwonpark.github.io/Chapter2/" rel="alternate" type="text/html" title="Chapter 2 순환(Recursion)" /><published>2025-03-12T00:00:00+00:00</published><updated>2025-03-12T00:00:00+00:00</updated><id>https://ssangwonpark.github.io/Chapter2</id><content type="html" xml:base="https://ssangwonpark.github.io/Chapter2/"><![CDATA[<h2 id="순환recursion">순환(Recursion)</h2>

<h3 id="순환recursion이란-알고리즘이나-함수가-수행-도중에-자기-자신을-다시-호출하여-문제를-해결하는-기법을-의미한다">순환(recursion)이란, 알고리즘이나 함수가 수행 도중에 자기 자신을 다시 호출하여 문제를 해결하는 기법을 의미한다.</h3>

<blockquote>
  <p>재귀 함수라고도 불린다.</p>
</blockquote>

<h2 id="순환과-반복">순환과 반복</h2>

<h4 id="q-sumlimits_k1n-k를-순환과-반복으로-구해보자">Q. $\sum\limits_{k=1}^n k$를 순환과 반복으로 구해보자.</h4>

<p>$\sum\limits_{k=1}^n k$는 n이 주어졌을 때, $1 + 2 + 3 + … + n$으로 해결 가능하다. <br /><br />
이를 코드로 풀이하면 다음과 같이 나타낼 수 있다.</p>

<h4 id="순환을-이용한-sumlimits_k1n-k">순환을 이용한 $\sum\limits_{k=1}^n k$</h4>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">sigmak</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">){</span>
    <span class="k">if</span><span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="p">(</span><span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="p">(</span><span class="n">n</span> <span class="o">+</span> <span class="n">sigmak</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">));</span>
<span class="p">}</span>
</code></pre></div></div>

<h4 id="반복을-이용한-sumlimits_k1n-k">반복을 이용한 $\sum\limits_{k=1}^n k$</h4>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>

    <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">ans</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">);</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">ans</span> <span class="o">=</span> <span class="n">ans</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>둘 다 동일한 작업을 수행할 수 있지만, 순환의 경우 함수 영역 + 돌아갈 곳의 주소 + $@$ 를 계속 가지기 때문에 오버헤드와와 메모리 사용량이 크다.<br />
메모리와 속도 면에서 반복에 비해 좋지 않기 때문에 임베디드시스템 등에서는 잘 사용하지 않는다.<br /></p>

<p><img src="../images/2025-03-12-23-41-37.png" alt="" /></p>

<blockquote>
  <p>따라서 반복으로 가능하다면 순환보다는 반복을 사용하는 것이 좋다.</p>
</blockquote>

<hr />

<h4 id="q-xn을-순환으로-구현하자">Q. $x^n$을 순환으로 구현하자.</h4>

<p>거듭제곱 $x^3$ 풀어서 쓰면 $x * x * x$로 나타낼 수 있다. 주어진 n(제곱)의 수 만큼 곱하면, $O(n)$으로 $x^n$을 구할 수 있다.<br /><br />
이를 코드로 하면 아래와 같다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">power</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span><span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">else</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="n">x</span> <span class="o">*</span> <span class="n">power</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<blockquote>
  <p>Q. $O(n)$보다 더 빠른 코드가 없을까? <br /></p>
</blockquote>

<p>단순히 $x<em>x</em>…*x$ 반복하는 것이 아닌 주어진 $n$이 짝수인지 홀수인지에 따라 $n$을 절반씩 줄여가며 순환적인 방법으로 1(탈출조건)에 도달하게 할 수 있다. <br /></p>

<p><img src="../images/2025-03-13-00-40-23.png" alt="" /></p>

<p>이를 코드로 표현하면 아래와 같다. $O(log n)$으로 동작한다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">power</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span><span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">else</span> <span class="k">if</span> <span class="p">((</span><span class="n">n</span> <span class="o">%</span> <span class="mi">2</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">)</span>
    <span class="p">{</span>   <span class="c1">// n == 짝수</span>
        <span class="k">return</span> <span class="n">power</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">x</span><span class="p">,</span> <span class="n">n</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">else</span>
    <span class="p">{</span>   <span class="c1">// n == 홀수</span>
        <span class="k">return</span> <span class="n">x</span> <span class="o">*</span> <span class="n">power</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">x</span><span class="p">,</span> <span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<hr />

<h4 id="q-fibonacci-수열">Q. Fibonacci 수열</h4>

<p>피보나치 수열은 n번째 값을 구할 때, (n-1)번째 값과 (n-2)번째 값의 합으로 나타낼 수 있다.<br /><br />
이를 코드로 표현하면 아래와 같다.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#include &lt;stdio.h&gt;

int fibonacci(int n) {

	if (n == 0) {
		return 0;
	}
	if (n == 1) {
		return 1;
	}
	return fibonacci(n - 2) + fibonacci(n - 1);
}
</code></pre></div></div>

<blockquote>
  <p>지금 피보나치 수열은 불필요한 부분이 존재한다.<br />
다음 그림에서 색칠된 부분을 확인해보자.</p>
</blockquote>

<p><img src="../images/2025-03-12-16-47-57.png" alt="" /></p>

<p>순환 과정에서 동일한 함수를 부르는 불필요한 과정이 존재한다. 이를 어떻게하면 해결가능할까? <br /><br />
간단하다. 배열을 통해 중복되는 함수를 저장해두고, 함수를 호출하지 않고 바로 값을 리턴하자.<br /><br />
이를 코드로 하면 아래와 같다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#define SIZE 100
</span>
<span class="kt">int</span> <span class="n">fibo_list</span><span class="p">[</span><span class="n">SIZE</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span><span class="p">,</span> <span class="p">};</span>

<span class="kt">int</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
	<span class="p">}</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">fibo_list</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="n">fibo_list</span><span class="p">[</span><span class="n">n</span><span class="p">];</span>
    <span class="p">}</span>

    <span class="n">fibo_list</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">fibonacci</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fibonacci</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">2</span><span class="p">);</span>

    <span class="k">return</span> <span class="n">fibo_list</span><span class="p">[</span><span class="n">n</span><span class="p">];</span>
<span class="p">}</span>
</code></pre></div></div>

<blockquote>
  <p>이전의 순환만을 이용한 코드가 $O(2^n)$이었지만, 배열을 이용한다면 $O(n)$으로 효율적으로 계산가능하다.</p>
</blockquote>

<hr />

<h4 id="q-하노이의-탑">Q. 하노이의 탑</h4>

<p>하노이의 탑은 3개의 기둥 중 한쪽에 원판을 쌓아두고, 다른 쪽으로 모두 옮기는 게임이다.<br />
위에 작은 원판을 치우지 않으면 아래의 원판을 옮기지 못하기 때문에 원판이 위치한 기둥과 옮기려는 기둥 외에 임시 기둥을 통해 이동시키는 것이 관건이다.<br /><br />
원판이 4개인 경우를 그림을 통해 살펴보자.</p>

<p><img src="../images/2025-03-13-00-24-21.png" alt="" /></p>

<p>이처럼 A기둥에서 C기둥으로 모두 옮기기 위해서는 B기둥을 이용해 작은 원판들을 치워두고, 큰 원판부터 C로 옮겨야 한다.<br />
하노이의 탑은 원판 수에 따라 2개일 때, 3번을, 3개일 때, 7번을, 그리고 그림과 같이 4개일 때, 15번 옮기면 최소한의 움직임으로 해결가능하다.<br /></p>

<blockquote>
  <p>이를 통해 우리는 하노이의 탑의 최소이동횟수가 $2^n - 1$임을 알 수 있다.</p>
</blockquote>

<p>하노이의 탑을 코드로 표현한다면 아래와 같다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">hanoi</span><span class="p">(</span><span class="kt">int</span> <span class="n">_n</span><span class="p">,</span> <span class="kt">char</span> <span class="n">_src</span><span class="p">,</span> <span class="kt">char</span> <span class="n">_dst</span><span class="p">,</span> <span class="kt">char</span> <span class="n">_temp</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span><span class="p">(</span> <span class="n">_n</span> <span class="o">==</span> <span class="mi">1</span> <span class="p">)</span>
    <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"원판을 %c 에서 %c으로 옮긴다.</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">_src</span><span class="p">,</span> <span class="n">_dst</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">else</span>
    <span class="p">{</span>
        <span class="n">hanoi</span><span class="p">(</span><span class="n">_n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">_src</span><span class="p">,</span> <span class="n">_temp</span><span class="p">,</span> <span class="n">_dst</span><span class="p">);</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"원판을 %c에서 %c으로 옮긴다.</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">_src</span><span class="p">,</span> <span class="n">_dst</span><span class="p">);</span>
        <span class="n">hanoi</span><span class="p">(</span><span class="n">_n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">_temp</span><span class="p">,</span> <span class="n">_dst</span><span class="p">,</span> <span class="n">_src</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h4 id="q-하노이의-탑-원반이-100개라면">Q. 하노이의 탑 원반이 100개라면?</h4>

<p>A. 하노이의 탑의 최소이동횟수는 $2^n - 1$이므로 $n$에 100을 넣으면<br /></p>

<h4 id="1267650600228229401496703205375">$1,267,650,600,228,229,401,496,703,205,375$</h4>

<p>1경 2676조 5060억 0228만 2294천 0149 이라는 말도 안되는 숫자가 나온다.<br />
만약 1번의 이동 횟수에 1나노초(nano-second)가 걸린다고 가정한다면,<br />
약 40조 1757억 4664만 2538년이라는 우주의 나이(약 138억 년)보다 훨씬 긴 시간이 걸린다.</p>]]></content><author><name>Park SangWon</name></author><category term="DataStructure" /><summary type="html"><![CDATA[Data Structure 2장 순환(Recursion)]]></summary></entry><entry><title type="html">Chapter 1 자료구조와 알고리즘</title><link href="https://ssangwonpark.github.io/chapter1/" rel="alternate" type="text/html" title="Chapter 1 자료구조와 알고리즘" /><published>2025-03-11T00:00:00+00:00</published><updated>2025-03-11T00:00:00+00:00</updated><id>https://ssangwonpark.github.io/chapter1</id><content type="html" xml:base="https://ssangwonpark.github.io/chapter1/"><![CDATA[<h2 id="자료구조">자료구조</h2>

<h3 id="자료구조란">자료구조란?</h3>

<p>데이터들의 모임, 데이터 간의 관계. <br /></p>

<blockquote>
  <p>ex) 기초자료형(char, ing, float, double), 파생 자료형(배열, 포인터), 사용자 정의 자료형(구조체, 공용체, 열거체), …</p>
</blockquote>

<h3 id="삶-속의-자료구조">삶 속의 자료구조</h3>

<p>옷들을 분류하고 정리하는 <strong>옷장</strong>, 책들을 정리하는 <strong>책장</strong> 등<br />
<strong>데이터(자료)들을 모아두는 공간, 장소, 방법</strong>이라고 생각할 수 있다.</p>

<hr />

<h2 id="알고리즘">알고리즘</h2>

<p><strong>알고리즘이이란?</strong></p>

<p>컴퓨터로 문제를 풀기 위한 단계적 절차</p>

<blockquote>
  <p>ex) 정렬(Sort), 탐색(Search), 그래프(Graph), …</p>
</blockquote>

<h3 id="삶-속의-알고리즘">삶 속의 알고리즘</h3>

<p>우리를 최단거리로 안내해주는 <strong>네비게이션</strong>, 우리의 경향성을 파악해 광고하는 <strong>구글 광고</strong> 등<br />
<strong>문제를 풀기위한 방법</strong>이라고 생각할 수 있다.</p>

<hr />

<h2 id="자료구조와-알고리즘">자료구조와 알고리즘</h2>

<blockquote>
  <p>자료구조 + 알고리즘 = 프로그램</p>
</blockquote>

<p>자료구조와 알고리즘은 밀접하게 연관되어 있다.<br /></p>

<h4 id="q-만약-1부터-10까지-데이터를-저장-정렬하는-문제가-있다고-가정하자">Q. 만약 1부터 10까지 데이터를 저장, 정렬하는 문제가 있다고 가정하자.<br /><br /></h4>

<p>단순한 int형을 사용해서 구한다면 계속 다른 변수명을 선언해 데이터를 저장하고, 정렬할 것이다.<br />
그러나 배열을 이용한다면 int a[10] 이라고 선언하고, 배열 인덱스를 움직이며 보다 편하게 해결할 수 있다.<br /></p>

<blockquote>
  <p>이처럼 같은 문제를 풀더라도 <strong>효과적인 자료구조, 알고리즘</strong>이 존재한다.<br />
그러므로 우리는 문제에 대해 보다 효율적이고 효과적인 자료구조를 택해 해결하는 것이 바람직하다.</p>
</blockquote>

<hr />

<h3 id="알고리즘-기술-방법">알고리즘 기술 방법</h3>

<ul>
  <li>영어나 한국어 같은 자연어<br /></li>
  <li>흐름도(flow chart)<br /></li>
  <li>유사 코드(pseudo-code)<br /></li>
  <li>프로그래밍 언어<br /></li>
</ul>

<h4 id="q-자연수-n--0이-주어졌을-때-소수인지-판단하는-알고리즘">Q. 자연수 n (&gt; 0)이 주어졌을 때, 소수인지 판단하는 알고리즘</h4>

<p>영어나 한국어 같은 자연어</p>

<blockquote>
  <p>반복하면서 i의 값을 2부터 n-1까지 증가시켜 n의 값과 나누어 떨어지면 소수가 아님.<br />
만약 n이 i로 나누어 떨어지지 않았다면, 소수.</p>
</blockquote>

<p>흐름도(flow chart)</p>

<p><img src="../images/2025-03-20-00-00-57.png" alt="" /></p>

<p>유사 코드(pseudo-code)</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>for(i가 n이 될 때까지){
  if (n이 i로 나누어 떨어진다면) 소수가 아닙니다.
}
소수입니다.
</code></pre></div></div>

<hr />

<h2 id="추상-데이터-타입adt-abstract-data-type">추상 데이터 타입(ADT: Abstract Data Type)</h2>

<blockquote>
  <p>추상 데이터 타입은 데이터와 그 데이터가 어떤 것을 하는지를 포함하고 있다.
ex) class</p>
</blockquote>

<p>우리가 흔히 아는 구조체의 경우, 아래와 같이 여러 자료형들을 담을 수 있다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="k">struct</span> <span class="n">A</span>  <span class="c1">// 구조체. 자료형</span>
<span class="p">{</span>
    <span class="kt">int</span> <span class="n">i</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">j</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>

<p>그러나 추상 데이터 타입은 데이터(자료형) 뿐만 아니라 그 값들의 연산(함수)를 담고 있다.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span>
<span class="n">class</span> <span class="n">B</span> <span class="c1">// 클래스. 추상 데이터 타입.</span>
<span class="p">{</span>
<span class="nl">public:</span>
    <span class="kt">int</span> <span class="n">i</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">j</span><span class="p">;</span>

    <span class="kt">int</span> <span class="n">whichIsBigger</span><span class="p">(){</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">&gt;</span> <span class="n">j</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="k">return</span> <span class="n">i</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="p">{</span>
            <span class="k">return</span> <span class="n">j</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">};</span>

</code></pre></div></div>

<hr />

<h2 id="시간-복잡도빅오--big-o">시간 복잡도(빅오 : Big-O)</h2>

<blockquote>
  <p>알고리즘 성능 비교는 수행 시간 측정, 시간 복잡도(tiem complexity), 공간 복잡도(space complexity)로 비교가능하다.<br />
이 때, 중요하지 않은 부분을 제거하고 간단하게 표현한 점근적 표기법(오메가 표기법, 세타 표기법, 빅오 표기법)로 효과적인 비교가 가능하다.<br />
아래는 시간복잡도로 코드의 수행했을 때, 시간을 표로 나타낸 것이다.</p>
</blockquote>

<p><img src="../images/2025-03-12-00-57-17.png" alt="" /></p>

<p>실제로 $O(1)$이 단 한 번의 동작만을 하는 것은 아니고, $n$값을 무한으로 가정했을 때, 무시 가능한 상수를 의미한다.<br />
동일하게 $O(n)$ 역시 실제 수행 횟수는 ${4n + 5}$일지라도 무한으로 가정했을 때, 계수와 이하 차수는 무시가능하기에 $O(n)$로 표기한다.<br />
따라서 만약 ${4n^2 + 3n + 7}$라면 $n$이 무한일 때 불필요한 계수와 이차항 이하 항을 무시하고 $O(n^2)$으로 표현가능하다.<br />
마찬가지로 $2n^2 + 3n + 7$회 수행되는 알고리즘의 시간 복잡도는 $O(n^2)$이다.</p>

<p>아래는 빅오 표기법에 대한 시간에 대한 입력의 수($n$)을 그래프로 나타낸 것이다.</p>

<p><img src="../images/2025-03-12-12-52-37.png" alt="" /></p>

<hr />

<h3 id="이진-탐색binary-search의-빅오-표기법">이진 탐색(Binary search)의 빅오 표기법</h3>

<h4 id="q-정렬된-숫자-5개가-주어지고-찾을-값-n이-주어졌을-때-어떻게-하면-빠르게-n을-찾을-수-있을까">Q. 정렬된 숫자 5개가 주어지고, 찾을 값 n이 주어졌을 때, 어떻게 하면 빠르게 n을 찾을 수 있을까?</h4>

<p>가장 쉽게 생각하자면, 첫번째 값부터 순차적으로 n와 비교해보는 것이다.<br />
운이 좋아, 첫번째 값이 검색하려는 값과 동일하다면 1번만에 찾을 수 있을 것이다. $O(1)$<br />
그러나 검색하려는 값이 배열에 없거나, 마지막에 위치한다면 n번만에 찾을 수 있을 것이다. $O(n)$<br />
따라서 Big-O는 $O(n)$이다.<br /></p>

<blockquote>
  <p>운이 좋으면 1번, 운이 나쁘면 n번, 더 효과적인 알고리즘이 없을까?</p>
</blockquote>

<p>이진 탐색 알고리즘은 정렬되어 있는 배열에서 검색범위를 줄여가며 검색 값을 찾는 알고리즘이다.<br />
1부터 5까지의 배열이 있다면, $n$값을 찾기 위해 중앙값을 찾아 큰지 작은지 판단하고 작다면 왼쪽 구간에 대해, 크다면 오른쪽 구간에 대해 탐색한다.<br />
중간 값과 찾으려는 값을 값을 찾거나 더 이상 탐색할 수 없을 때 까지 반복한다.<br /></p>

<blockquote>
  <p>만약 정렬되어 있는 15개의 배열 중 60을 찾는다면, 아래와 같이 동작한다.</p>
</blockquote>

<p><img src="../images/2025-03-12-14-06-14.png" alt="" /></p>

<p>이진 탐색 알고리즘은 운이 좋으면 $O(1)$, 운이 나빠도 $O(log n)$만에 찾을 수 있다.<br /></p>

<blockquote>
  <p>따라서 이진 탐색 알고리즘의 Big-O는 $O(log n)$이다.</p>
</blockquote>]]></content><author><name>Park SangWon</name></author><category term="DataStructure" /><summary type="html"><![CDATA[Data Structure 1장 자료구조와 알고리즘]]></summary></entry></feed>