<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>강동영의 일상</title>
    <link>https://rokaf6444.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 14 Aug 2026 13:01:10 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>rokaf6444</managingEditor>
    <image>
      <title>강동영의 일상</title>
      <url>https://tistory1.daumcdn.net/tistory/5441795/attach/c36a45274b2541c5b9288f575bc4444c</url>
      <link>https://rokaf6444.tistory.com</link>
    </image>
    <item>
      <title>[자료구조] 연결리스트 2</title>
      <link>https://rokaf6444.tistory.com/16</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;br /&gt;이번 글에서는 &lt;b&gt;연결리스트&lt;/b&gt;를 지난 글에 이어서 배울 겁니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;지난 글에서 노드를 만든 후 서로 연결해보았습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;작은 리스트이면 지난 글과 같이 만들어도 되지만 리스트가 커지면 전용 함수들을 통하여 노드를 추가하는 것이 편리합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;단순 연결리스트에서 저희가 작성할 함수들은 다음과 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;- insert_first() : 리스트의 시작 부분에 항목을 삽입하는 함수입니다.&lt;br /&gt;- insert() : 리스트의 중간 부분에 항목을 삽입하는 함수입니다.&lt;br /&gt;- delete_first() : 리스트의 첫 번째 항목을 삭제하는 함수입니다.&lt;br /&gt;- delete() : 리스트의 중간 항목을 삭제하는 함수입니다.&lt;br /&gt;- print_list() : 리스트를 방문하여 모든 항목을 출력하는 함수입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;단순 연결리스트 정의&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;단순 연결리스트는 원칙적으로 헤드 포인터만 있으면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;ListNode *head;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;insert_first() : 리스트의 시작 부분에 항목을 삽입하는 함수&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;아래의 코드에서 매개 변수 head는 헤드 포인터이고 value는 새롭게 추가되는 데이터입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;ListNode* insert_first(ListNode* head, int value)
{
	ListNode* p = (ListNode*)malloc(sizeof(ListNode)); // 동적 메모리 할당을 통하여 새로운 노드 p를 생성함
	p-&amp;gt;data = value; // p-&amp;gt;data에 value를 저장함
	p-&amp;gt;link = head; // p-&amp;gt;link를 현재 head값으로 변경함
	head = p; // head값을 p값으로 변경함

	return head; // 변경된 헤드 포인터 반환함
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;1. ListNode *p = (ListNode *)malloc(sizeof(ListNode))는 노드를 추가하는 과정에서 먼저 새로운 노드(p)를 동적 메모리 할당을 통해 생성합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;2. p-&amp;gt;data = value는 새로운 노드 p의 'data' 필드에 매개 변수로 받은 value 값(데이터)를 저장합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;3. p-&amp;gt;link = head는 새로운 노드 p의 'link' 필드에 현재 head 값(헤드 포인터가 가리키는 노드의 주소 값)을 저장합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이렇게 되면 새로운 노드의 다음 노드가 원래 리스트의 첫 번째 노드가 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;4. head = p는 헤드 포인터의 값을 p 값(새로운 노드의 주소)으로 변경합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이제 헤드 포인터는 새로 추가된 노드를 가리키게 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;5. return head는 변경된 헤드 포인터를 반환합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이는 새로운 노드가 리스트의 시작 부분에 추가되었음을 나타냅니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;코드를 그림으로 보면 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s3pVJ/btsqviIwZXl/YlPUKjqkSDCD2G9Fb1HoQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s3pVJ/btsqviIwZXl/YlPUKjqkSDCD2G9Fb1HoQk/img.png&quot; data-alt=&quot;출처 : C언어로 쉽게 풀어쓴 자료구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s3pVJ/btsqviIwZXl/YlPUKjqkSDCD2G9Fb1HoQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs3pVJ%2FbtsqviIwZXl%2FYlPUKjqkSDCD2G9Fb1HoQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;579&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : C언어로 쉽게 풀어쓴 자료구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;insert() : 리스트의 중간 부분에 항목을 삽입하는 함수&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이 함수는 연결리스트의 중간에 새로운 노드를 추가합니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;이때는 반드시 삽입되는 위치의 선행 노드를 알아야 삽입이 가능합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;그리고 선행 노드를 pre가 가리키고 있다고 가정합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;// 노드 pre 뒤에 새로운 노드 삽입
ListNode* insert(ListNode* head, ListNode* pre, element value)
{
	ListNode* p = (ListNode*)malloc(sizeof(ListNode));
	p-&amp;gt;data = value;
	p-&amp;gt;link = pre-&amp;gt;link;
	pre-&amp;gt;link = p;

	return head;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. ListNode *p = (ListNode *)malloc(sizeof(ListNode))는 노드를 추가하는 과정에서 먼저 새로운 노드(p)를 동적 메모리 할당을 통해 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. p-&amp;gt;data = value는 새로운 노드 p의 'data' 필드에 매개 변수로 받은 value 값(데이터)를 저장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. p-&amp;gt;link = pre-&amp;gt;link는 새로운 노드 p의 'link' 필드에 선행 노드 pre의 'link'필드 값을 저장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이건 새로운 노드가 선행 노드의 다음 노드를 가리킬 수 있게 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. pre-&amp;gt;link = p는 선행 노드 pre의 'link' 필드 값을 새로운 노드 p의 주소로 변경합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이로써 선행 노드(pre)와 새로운 노드(p) 사이에 연결이 생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5. return head는 헤드 포인터를 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이는 중간 부분에 노드가 추가되었음을 나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cICa8o/btsp0SEeYxq/k2EomHb07PImX36N32IIK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cICa8o/btsp0SEeYxq/k2EomHb07PImX36N32IIK1/img.png&quot; data-alt=&quot;출처 : C언어로 쉽게 풀어쓴 자료구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cICa8o/btsp0SEeYxq/k2EomHb07PImX36N32IIK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcICa8o%2Fbtsp0SEeYxq%2Fk2EomHb07PImX36N32IIK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;469&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : C언어로 쉽게 풀어쓴 자료구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;delete_first() : 리스트의 첫 번째 항목을 삭제하는 함수&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;ListNode* delete_first(ListNode* head)
{
	ListNode* removed;
	if (head == NULL) return NULL;
	removed = head;
	head = removed-&amp;gt;link;
	free(removed);

	return head;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. ListNode *removed는 삭제할 노드를 가리킬 포인터를 선언합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. if (head == NULL) return NULL는 리스트가 비어 있으면(NULL 인 경우) NULL을 반환하여 함수를 종료합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. removed = head는 삭제할 노드로 헤드 포인터(head)가 가리키는 노드를 지정합니다(첫 번째 노드).&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. head = removed-&amp;gt;link는 헤드 포인터를 두 번째 노드로 옮깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 되면 기존의 첫 번째 노드는 리스트에서 끊어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5. free(removed)는 removed가 가리키는 노드(첫 번째 노드)를 메모리에서 해제하여 더 이상 사용되지 않게 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;6. return head는 변경된 헤드 포인터를 반환합니다. 이렇게 리스트의 첫 번째 노드가 삭제되었음을 나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bty2Ip/btsp6rezPDd/cXIrOVqi6wTepJfX2Lkq9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bty2Ip/btsp6rezPDd/cXIrOVqi6wTepJfX2Lkq9k/img.png&quot; data-alt=&quot;출처 : C언어로 쉽게 풀어쓴 자료구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bty2Ip/btsp6rezPDd/cXIrOVqi6wTepJfX2Lkq9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbty2Ip%2Fbtsp6rezPDd%2FcXIrOVqi6wTepJfX2Lkq9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;343&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : C언어로 쉽게 풀어쓴 자료구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;delete() : 리스트의 중간 항목을 삭제하는 함수&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;// pre가 가리키는 노드의 다음 노드를 삭제한다. 
ListNode* delete(ListNode* head, ListNode* pre)
{
	ListNode* removed;
	removed = pre-&amp;gt;link;
	pre-&amp;gt;link = removed-&amp;gt;link;
	free(removed);

	return head;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. ListNode* removed는 삭제할 노드를 가리킬 포인터를 선언합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. removed = pre-&amp;gt;link는 삭제할 노드로 pre(선행 노드)의 다음 노드를 지정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. pre-&amp;gt;link = removed-&amp;gt;link는 선행 노드(pre)의 'link' 필드 값을 삭제할 노드(removed)의 다음 노드로 변경합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 되면 삭제할 노드는 리스트에서 끊어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. free(removed)는 removed가 가리키는 노드(삭제할 노드)를 메모리에서 해제하여 더 이상 사용되지 않게 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5. return head는 헤드 포인터를 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 리스트의 중간 노드가 삭제되었음을 나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CBkj3/btsp0BPVuaL/OKikH7RKmaSd1FcPb3QKN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CBkj3/btsp0BPVuaL/OKikH7RKmaSd1FcPb3QKN0/img.png&quot; data-alt=&quot;출처 : C언어로 쉽게 풀어쓴 자료구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CBkj3/btsp0BPVuaL/OKikH7RKmaSd1FcPb3QKN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCBkj3%2Fbtsp0BPVuaL%2FOKikH7RKmaSd1FcPb3QKN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;272&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : C언어로 쉽게 풀어쓴 자료구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;print_list() : 리스트를 방문하여 모든 항목을 출력하는 함수&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;void print_list(ListNode *head)
{
	for (ListNode *p = head; p != NULL; p = p-&amp;gt;link)
		printf(&quot;%d-&amp;gt;&quot;, p-&amp;gt;data);
	printf(&quot;NULL \n&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;1. for (ListNode *p = head; p != NULL; p = p-&amp;gt;link)는 연결 리스트를 순회하기 위한 for 반복문입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;초기화 부분에서 포인터 변수 p에 head 값을 할당하여 첫 번째 노드부터 시작합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;조건 부분에서 p가 NULL이 아닌동안 반복문을 수행합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;NULL이 되면 리스트의 끝에 도달했다는 것을 의미합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;갱신 부분에서 p에&lt;span&gt;&amp;nbsp;&lt;/span&gt;p-&amp;gt;link를 할당해 다음 노드로 이동합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;2. printf(&quot;%d-&amp;gt;&quot;, p-&amp;gt;data)은 현재 노드(p)의 데이터를 출력합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;출력 형식은 데이터 값 뒤에 '-&amp;gt;'가 붙는 형태입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;3. printf(&quot;NULL \n&quot;)는 리스트의 끝에 도달했음을 나타내기 위해 &quot;NULL&quot;을 출력하고 줄 바꿈을 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;마지막으로 테스트 프로그램을 한번 살펴보겠습니다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;// 테스트 프로그램
int main(void)
{
	ListNode* head = NULL;

	for (int i = 0; i &amp;lt; 3; i++) {
		head = insert_first(head, i);
		print_list(head);
	}
	for (int i = 0; i &amp;lt; 3; i++) {
		head = delete_first(head);
		print_list(head);
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 이중연결리스트의 머리(head)를 NULL로 초기화합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 빈 이중연결리스트를 나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 세 번의 반복문을 수행하며, 이중연결리스트의 처음에 0부터 2까지의 정수를 삽입합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삽입할 때마다&lt;span&gt;&amp;nbsp;&lt;/span&gt;insert_first&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수를 호출하고, 리스트의 현재 상태를&lt;span&gt;&amp;nbsp;&lt;/span&gt;print_list&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수를 사용하여 출력합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 다음 세 번의 반복문에서 이중연결리스트에서 첫째 항목을 제거합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제거할 때마다&lt;span&gt;&amp;nbsp;&lt;/span&gt;delete_first&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수를 호출하고, 리스트의 현재 상태를&lt;span&gt;&amp;nbsp;&lt;/span&gt;print_list&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수를 사용하여 출력합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 프로그램이 성공적으로 종료되면 0을 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;207&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lqh5x/btsqaPypMct/2uK2i40xLbE3bIXykxn22K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lqh5x/btsqaPypMct/2uK2i40xLbE3bIXykxn22K/img.png&quot; data-alt=&quot;위의 코드를 실행한 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lqh5x/btsqaPypMct/2uK2i40xLbE3bIXykxn22K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flqh5x%2FbtsqaPypMct%2F2uK2i40xLbE3bIXykxn22K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;348&quot; data-origin-width=&quot;207&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위의 코드를 실행한 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>coding</category>
      <category>C언어로 쉽게 풀어쓴 자료구조</category>
      <category>연결리스트</category>
      <category>자료구조</category>
      <author>rokaf6444</author>
      <guid isPermaLink="true">https://rokaf6444.tistory.com/16</guid>
      <comments>https://rokaf6444.tistory.com/16#entry16comment</comments>
      <pubDate>Sat, 5 Aug 2023 06:30:47 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 연결리스트 1</title>
      <link>https://rokaf6444.tistory.com/15</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이번 글에서는 &lt;b&gt;연결리스트&lt;/b&gt;에 대해서 배워보도록 하겠습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1433&quot; data-origin-height=&quot;637&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX1LSA/btsp8YoVNhm/rkv36grYL7ntoUbSVtk3mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX1LSA/btsp8YoVNhm/rkv36grYL7ntoUbSVtk3mK/img.png&quot; data-alt=&quot;출처 : Share and Discover Knowledge on SlideShare&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX1LSA/btsp8YoVNhm/rkv36grYL7ntoUbSVtk3mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX1LSA%2Fbtsp8YoVNhm%2Frkv36grYL7ntoUbSVtk3mK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;222&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1433&quot; data-origin-height=&quot;637&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : Share and Discover Knowledge on SlideShare&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;연결리스트를 설명하기 전에 용어부터 살펴보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;리스트란?&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;A, B, C, ... 처럼 순서를 가진 항목들의 모임입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;항목이란?&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;데이터 필드를 말합니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;즉, 리스트의 원소들을 저장하는 곳입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;리스트는 대표적인 선형 자료구조로 노드들이 일렬로 연결된 구조입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;연결리스트에서는 리스트의 항목들을 노드라는 곳에 저장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;노드란?&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;항목(데이터)과 링&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;크의 쌍으로 표현합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;링크란?&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다음 노드에 대한 주소입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다음 노드가 있는 곳의 주소를 포인터로 표현합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그렇기에 노드들은 &lt;b&gt;데이터와 다른 노드에 대한 포인터&lt;/b&gt;를 가집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이렇게 만들어진 연결리스트는 아래의 조건에 따라서 유형이 나뉠 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;링크의 갯수&lt;/b&gt;에 따라서&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;단일 연결리스트&lt;/b&gt;와 &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;b&gt;이중 연결리스트&lt;/b&gt; 등으로 나타낼 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_edited_blob&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rRAm9/btsp63SaRsv/RSEQl3RdX52E7q9rm3kkVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rRAm9/btsp63SaRsv/RSEQl3RdX52E7q9rm3kkVk/img.png&quot; data-alt=&quot;출처 : Wikipedia&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rRAm9/btsp63SaRsv/RSEQl3RdX52E7q9rm3kkVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrRAm9%2Fbtsp63SaRsv%2FRSEQl3RdX52E7q9rm3kkVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;135&quot; data-filename=&quot;edited_edited_edited_blob&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : Wikipedia&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;단일 연결 리스트&lt;/b&gt;는 각 노드에 자료 공간과 한 개의 포인터 공간이 있고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start; font-family: 'Noto Serif KR';&quot;&gt;각 노드의 포인터는 다음 노드를 가리킵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EY61i/btsp1k1DRCP/g2MmkekjKoRoKM6d9kFvg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EY61i/btsp1k1DRCP/g2MmkekjKoRoKM6d9kFvg1/img.png&quot; data-alt=&quot;출처 : Wikipedia&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EY61i/btsp1k1DRCP/g2MmkekjKoRoKM6d9kFvg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEY61i%2Fbtsp1k1DRCP%2Fg2MmkekjKoRoKM6d9kFvg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;161&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : Wikipedia&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;이중 연결 리스트&lt;/b&gt;의 구조는 단일 연결 리스트와 비슷하지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start; font-family: 'Noto Serif KR';&quot;&gt;포인터 공간이 두 개가 있고 각각의 포인터는 앞의 노드와 뒤의 노드를 가리킵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;링크가 순환하는 구조인가에 따라&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;선형 연결리스트&lt;/b&gt;와 &lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;b&gt;원형 연결리스트&lt;/b&gt; 등으로 나눌 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;b&gt;선형 연결리스트&lt;/b&gt;는 단일 연결리스트,&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;이중 연결리스트와 같은 선형 구조인 연결리스트를 말합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boDoCQ/btsp2jVzweu/qYkFxK2TB2rY97usbNsIK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boDoCQ/btsp2jVzweu/qYkFxK2TB2rY97usbNsIK0/img.png&quot; data-alt=&quot;출처 : Wikipedia&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boDoCQ/btsp2jVzweu/qYkFxK2TB2rY97usbNsIK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboDoCQ%2Fbtsp2jVzweu%2FqYkFxK2TB2rY97usbNsIK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;138&quot; data-filename=&quot;edited_blob&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : Wikipedia&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start; font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;원형 연결 리스트&lt;/b&gt;는 일반적인 연결 리스트에 마지막 노드와 처음 노드를 연결시켜 원형으로 만든 구조입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;689&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwaD1C/btsp7pAMYq3/SldTyWkIRMm4YPut1nZka0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwaD1C/btsp7pAMYq3/SldTyWkIRMm4YPut1nZka0/img.png&quot; data-alt=&quot;출처 : Share and Discover Knowledge on SlideShare&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwaD1C/btsp7pAMYq3/SldTyWkIRMm4YPut1nZka0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwaD1C%2Fbtsp7pAMYq3%2FSldTyWkIRMm4YPut1nZka0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;322&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;689&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : Share and Discover Knowledge on SlideShare&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;배열을 이용한 구현에는 &lt;b&gt;인덱스를 이용하여 접근&lt;/b&gt;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;배열은 크기가 고정되어 있어서 원소의 갯수를 모를 때 &lt;b&gt;메모리 낭비가 발생&lt;/b&gt;할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;때에 따라서 메모리가 모자라는 경우도 생깁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;연결리스트를 이용한 구현에서는 위의 사진과 같이 20 -&amp;gt; 30 -&amp;gt; 40 뒤에 노드들을 이어서 &lt;b&gt;동적으로 연결&lt;/b&gt;할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;연결리스트와 배열을 비교해 보겠습니다.&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 147px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 21px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;연결리스트&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 21px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;배열&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 42px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;가변적인 크기로 메모리 낭비가 적음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 42px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;고정된 크기의 데이터를 저장할 때 적합함&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그렇지 않을 경우 메모리 낭비가 많을 수 있음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;삽입과 삭제가 효율적임&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;삽입과 삭제시에 데이터의 이동이 발생함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 42px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 42px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;임의의 위치에 대한 접근이 안 됨&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;- 순차적인 탐색만 가능함&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 42px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;임의의 위치에 인덱스를 통한 접근이 쉬움&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;순차적으로 데이터에 접근할 경우 느림&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 21px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;순차적인 접근시 매우 빠름&lt;br /&gt;(순차적인 메모리 공간이 할당되기 때문임)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;연결리스트는 크기가 제한되지 않고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;중간에서 쉽게 삽입하거나 삭제할 수 있는 유연한 리스트를 구현할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하지만 구현이 복잡하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;임의의 항목(i번째 항목)을 추출하려고 할 때는 배열을 사용하는 방법보다 시간이 오래 걸립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;즉, 리스트는 &lt;b&gt;배열로 구현&lt;/b&gt;할 수 있으나,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;삽입과 삭제가 자주 일어날 경우&lt;/b&gt;에 연결리스트를 사용하는 것이 &lt;b&gt;효율적&lt;/b&gt;이라는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;항목과 링크를 가진 노드의 C 표현&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1691176039685&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;typedef int item // typedef로 항목을 추상화
typedef struct ListNode {
	item data;
	struct ListNode* link; // ListNode 구조체를 가리키는 포인터 변수
} ListNode;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 코드에서 item은 항목을 저장할 수 있게 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;link는 ListNode 구조체를 가리키는 포인터 변수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우리는 구조체 변수를 포인터를 통해서 접근해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ListNode node = { 10, NULL }; // 이 구조체가 있을 때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ListNode *list = &amp;amp;node; // 구조체를 가리키는 포인터 변수 list가 node의 주소값을 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;즉, node를 참조하고 있다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;data에 접근하는 방법은 두 가지가 있습니다.&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. (*list).data&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;list라고 하는 포인터 변수가 참조하고 있는 구조체(노드)의 원소에 접근해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그렇기에 도트 연산자(.)을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. list-&amp;gt;data&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;포인터 변수 list를 통해 구조체 변수 내부의 멤버에 접근하는 표현입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그렇기에 화살표 연산자(-&amp;gt;)를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래는 data에 접근하는 두 가지 방법을 보여주기 위한 예시 코드입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1691177124737&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

typedef int item;
typedef struct ListNode {
	item data;
	struct ListNode* link;
} ListNode;

int main() {
	ListNode node = { 10, NULL };
	ListNode* list = &amp;amp;node;

	printf(&quot;node.data = %d\n&quot;, node.data); // 노드 객체의 데이터
	printf(&quot;(*list).data = %d\n&quot;, (*list).data); // list라는 포인터 변수가 참고하는 객체의 데이터
	printf(&quot;list-&amp;gt;data = %d\n&quot;, list-&amp;gt;data);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;210&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CkI5t/btsp2bcg2ub/W0frH8IBPXVSKSSBQgkUY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CkI5t/btsp2bcg2ub/W0frH8IBPXVSKSSBQgkUY1/img.png&quot; data-alt=&quot;위의 코드를 실행한 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CkI5t/btsp2bcg2ub/W0frH8IBPXVSKSSBQgkUY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCkI5t%2Fbtsp2bcg2ub%2FW0frH8IBPXVSKSSBQgkUY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;179&quot; data-origin-width=&quot;210&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위의 코드를 실행한 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래의 코드는 다른 예시입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1691177595225&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

typedef int item;
typedef struct ListNode {
	item data;
	struct ListNode* link;
} ListNode;

int main() {
	ListNode* p1;
	ListNode* p2;

	p1 = (ListNode*)malloc(sizeof(ListNode));
	p1-&amp;gt;data = 10;

	p2 = (ListNode*)malloc(sizeof(ListNode));
	p2-&amp;gt;data = 20;
	p2-&amp;gt;link = NULL;
	p1-&amp;gt;link = p2;

	printf(&quot;p1-&amp;gt;data = %d\n&quot;, p1-&amp;gt;data);
	printf(&quot;p1-&amp;gt;link-&amp;gt;data = %d\n&quot;, p1-&amp;gt;link-&amp;gt;data);
	printf(&quot;p2-&amp;gt;data = %d\n&quot;, p2-&amp;gt;data);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;p1은 ListNode 객체를 가리키는 포인터 변수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;malloc을 이용해서 동적으로 ListNode 객체를 만들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;객체가 생성된 후, 구조체의 데이터에 접근한 후 10을 넣었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;p2도 같은 방법으로 동적 메모리를 만들고 동적 메모리의 데이터 필드에 20을 넣었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 p2의 link에는 NULL을 넣었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;값이 할당되지 않던 p1의 link에 p2를 넣었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;p1과 p2는 모두 포인터 변수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그렇기에 p1의 link와 p2는 같은 메모리 영역을 가리키게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이러한 과정을 통해서 두 노드 간에 연결이 형성되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 p1-&amp;gt;link의 값과 p2의 값은 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;따라서 아래와 같은 실행 결과가 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;235&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brmGGQ/btsp1gSpQW0/xysX77WS88KIyCYxSW41O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brmGGQ/btsp1gSpQW0/xysX77WS88KIyCYxSW41O0/img.png&quot; data-alt=&quot;위의 코드 실행한 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brmGGQ/btsp1gSpQW0/xysX77WS88KIyCYxSW41O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrmGGQ%2Fbtsp1gSpQW0%2FxysX77WS88KIyCYxSW41O0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;164&quot; data-origin-width=&quot;235&quot; data-origin-height=&quot;77&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위의 코드 실행한 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>coding</category>
      <category>slideshare</category>
      <category>wikipedia</category>
      <category>연결리스트</category>
      <category>자료구조</category>
      <author>rokaf6444</author>
      <guid isPermaLink="true">https://rokaf6444.tistory.com/15</guid>
      <comments>https://rokaf6444.tistory.com/15#entry15comment</comments>
      <pubDate>Sat, 5 Aug 2023 06:30:32 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 이진탐색트리의 탐색, 삽입, 삭제</title>
      <link>https://rokaf6444.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이번 글에서는 이진탐색트리의 탐색, 삽입, 삭제, 출력을 살펴보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이진트리에서 원하는 값을 찾으려면 루트부터 시작해 현재 선택한 노드의 키 값과 목표하는 값을 비교하면서 왼쪽, 오른쪽으로 검색을 진행하면 됩니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DrBIU/btsoULYoMMw/efX3yckIBdyaRFVnDp0FQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DrBIU/btsoULYoMMw/efX3yckIBdyaRFVnDp0FQk/img.png&quot; data-alt=&quot;출처 : 생능 출판사&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DrBIU/btsoULYoMMw/efX3yckIBdyaRFVnDp0FQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDrBIU%2FbtsoULYoMMw%2FefX3yckIBdyaRFVnDp0FQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;369&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 생능 출판사&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;알고리즘은 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 루트부터 선택하여 검색을 진행합니다.&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;여기서 선택하는 노드를 p라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. p가 널이면 검색에 실패합니다.&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 검색하는 값 key와 선택한 노드 p의 키 값을 비교하여&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1) 값이 같으면 검색에 성공(검색 종료)합니다.&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2) key가 작으면 선택한 노드에 왼쪽 자식 노드를 대입합니다(왼쪽으로 검색 진행).&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3) key가 크면 선택한 노드에 오른쪽 자식 노드를 대입합니다(오른쪽으로 검색 진행).&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;4. 2번 과정으로 되돌아갑니다.&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;아래의 코드는 이 알고리즘을 바탕으로 이진탐색트리에서 노드를 검색하는 과정을 보여줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1690225288481&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 순환적인 탐색 함수
TreeNode* search(TreeNode* node, int  key)
{
	if (node == NULL) return NULL;
	if (key == node-&amp;gt;key) return node;
	else if (key &amp;lt; node-&amp;gt;key)
		return  search(node-&amp;gt;left, key);
	else
		return  search(node-&amp;gt;right, key);
}

// 반복적인 탐색 함수
TreeNode* search(TreeNode* node, int key)
{
	while (node != NULL) {
		if (key == node-&amp;gt;key) return node;
		else if (key &amp;lt; node-&amp;gt;key)
			node = node-&amp;gt;left;
		else
			node = node-&amp;gt;right;
	}
	return NULL; // 탐색에 실패했을 경우 NULL 반환
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;p를 루트로 하는 이진탐색트리에 데이터를 삽입하는 알고리즘은 다음과 같습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zYLbf/btsoRfe6WiC/wmq01kNfpXSyOmduDKd9a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zYLbf/btsoRfe6WiC/wmq01kNfpXSyOmduDKd9a0/img.png&quot; data-alt=&quot;출처 : 생능 출판사&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zYLbf/btsoRfe6WiC/wmq01kNfpXSyOmduDKd9a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzYLbf%2FbtsoRfe6WiC%2Fwmq01kNfpXSyOmduDKd9a0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;300&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 생능 출판사&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;p가 널인 경우&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;처음에 insert_node 함수를 호출할 때 널이면 루트 노드가 없다는 뜻입니다(이진탐색트리가 비어 있음).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;따라서 루트 노드를 만들고 값을 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그러면 루트만 있는 이진탐색트리가 만들어집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;함수를 처음 호출하는 상태가 아니라면(재귀 호출 시에 p의 값이 널이면) 노드를 삽입할 위치를 제대로 찾은 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;삽입할 노드를 만들고 값을 설정하면 삽입 과정이 끝납니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;p가 널인 아닌 경우는 세 가지 방법으로 처리합니다.&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 선택한 노드의 키 값과 삽입할 키 값이 같은 경우&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;값을 삽입할 수 없습니다. 삽입할 수 없다는 내용을 출력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 삽입할 키 값이 선택한 노드의 키 값보다 작은 경우&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;선택한 노드에 왼쪽 자식 노드를 대입합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 삽입할 키 값이 선택한 노드의 키 값보다 큰 경우&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;선택한 노드에 오른쪽 자식 노드를 대입합니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;아래의 코드는 이 알고리즘을 바탕의 의사코드입니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1690268052933&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;insert(root, n) :

	if KEY(n) == KEY(root) // root와 키가 같으면
		then return; // return
	else if KEY(n) &amp;lt; KEY(root) then // root보다 키가 작으면
		if LEFT(root) == NULL // root의 왼쪽 자식이
			then LEFT(root) &amp;larr; n; // 없으면 n이 왼쪽 자식
		else insert(LEFT(root), n); // 있으면 순환 호출
	else // root보다 키가 크면
		if RIGHT(root) == NULL
			then RIGHT(root) &amp;larr; n;
		else insert(RIGHT(root), n);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;아래의 코드는 위의 의사코드를 바탕으로 노드를 삽입하는 과정을 보여줍니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1690225315944&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TreeNode* insert_node(TreeNode* node, int key)
{
	// 트리가 공백이면 새로운 노드를 반환
	if (node == NULL) return new_node(key);

	// 그렇지 않으면 순환적으로 트리를 내려감
	if (key &amp;lt; node-&amp;gt;key)
		node-&amp;gt;left = insert_node(node-&amp;gt;left, key);
	else if (key &amp;gt; node-&amp;gt;key)
		node-&amp;gt;right = insert_node(node-&amp;gt;right, key);

	// 변경된 루트 포인터를 반환
	return node;
}

TreeNode* new_node(int item)
{
	TreeNode* temp = (TreeNode*)malloc(sizeof(TreeNode));
	temp-&amp;gt;key = item;
	temp-&amp;gt;left = temp-&amp;gt;right = NULL;

	return temp;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;노드를 삭제하는 함수&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;노드를 삭제하는 과정은 삽입하는 과정보다 복잡합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;노드를 삭제할 때는 '세 가지 서로 다른 상황'에 놓이기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;따라서 각각의 상황에 맞게 알맞은 처리를 해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 자식 노드가 없는 노드를 삭제하는 경우&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cblw4D/btsoTooOsNC/zUcILtD6u2aNUGxYWVl3QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cblw4D/btsoTooOsNC/zUcILtD6u2aNUGxYWVl3QK/img.png&quot; data-alt=&quot;출처 : 생능 출판사&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cblw4D/btsoTooOsNC/zUcILtD6u2aNUGxYWVl3QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcblw4D%2FbtsoTooOsNC%2FzUcILtD6u2aNUGxYWVl3QK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;502&quot; height=&quot;178&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 생능 출판사&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위의 크림은 자식 노드가 없는 노드 30을 삭제하는 경우입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이런 경우에는 노드 30을 가리키는 부모 노드 26의 오른쪽 포인터를 널로 업데이트하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이렇게 하면 노드 30은 아무것도 가리키지 않기 때문에 이진탐색트리에서 삭제됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 과정을 간단히 정리하면 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1) 삭제할 노드가 부모 노드의 왼쪽 자식이면 부모의 왼쪽 포인터를 NULL로 합니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2) 삭제할 노드가 부모 노드의 오른쪽 자식이면 부모의 오른쪽 포인터를 NULL로 합니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 작업이 끝난 다음에 삭제 대상인 노드 객체의 메모리 영역을 해제하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;만일 이런 순서로 삭제를 진행하지 않고 삭제할 노드의 메모리를 먼저 해제하면 부모는 해제한 메모리의 주소를 가리킵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이렇게 되면 프로그램에 치명적인 오류가 발생할 수 있습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 자식 노드가 1개인 포인터를 삭제하는 경우&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sHiC9/btsoTpVxVQF/kleT7oEkoQNedn5VTN2ZAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sHiC9/btsoTpVxVQF/kleT7oEkoQNedn5VTN2ZAk/img.png&quot; data-alt=&quot;출처 : 생능 출판사&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sHiC9/btsoTpVxVQF/kleT7oEkoQNedn5VTN2ZAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsHiC9%2FbtsoTpVxVQF%2FkleT7oEkoQNedn5VTN2ZAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;188&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 생능 출판사&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위의 그림은 자식 노드를 1개만 갖는 노드인 68을 삭제하는 경우입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이런 경우에는 원래 노드 68의 위치로 노드 99를 가져와야 삭제할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이런 과정을 거치면 '자식 노드 99를 루트로 하는 서브 트리의 모든 키 값은 부모 노드인 68보다 커야 한다'라는 조건을 유지할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;삭제 노드의 부모 노드인 35의 오른쪽 포인터가 삭제 대상 노드인 68의 자식 99를 가리키도록 업데이트하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그러면 68은 아무것도 가리키지 않기 때문에 이진검색트리에서 삭제됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 과정을 간단히 정리하면 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1) 삭제 대상 노드가 부모 노드의 왼쪽 자식인 경우&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;부모의 왼쪽 포인터가 삭제 대상 노드의 자식을 가리키도록 합니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2) 삭제 대상 노드가 부모 노드의 오른쪽 자식인 경우&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;부모의 오른쪽 포인터가 삭제 대상 노드의 자식을 가리키도록 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 자식 노드가 2개인 노드를 삭제하는 경우&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTARdq/btsoEqPF3fb/5TUXeg4S1Bt9XtEghKuYkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTARdq/btsoEqPF3fb/5TUXeg4S1Bt9XtEghKuYkK/img.png&quot; data-alt=&quot;출처 : 생능 출판사&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTARdq/btsoEqPF3fb/5TUXeg4S1Bt9XtEghKuYkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTARdq%2FbtsoEqPF3fb%2F5TUXeg4S1Bt9XtEghKuYkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;151&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 생능 출판사&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;자식 노드가 2개인 노드를 삭제하는 과정은 앞의 두 과정보다 더 복잡합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위의 그림은 노드 18을 삭제하는 경우입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;노드 18의 오른쪽 서브 트리(노드 26이 루트)의 노드 가운데 키 값이 가장 작은 노드 22를 노드 18이 있는 곳으로 옮겨 삭제해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 과정을 간단히 정리하면 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1) 삭제할 노드의 오른쪽 서브 트리에서 키 값이 가장 작은 노드를 검색합니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2) 검색한 노드를 삭제 위치로 옮깁니다(검색한 노드의 데이터를 삭제 대상 노드 위치로 복사합니다).&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3) 옮긴 노드를 삭제합니다.&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이때 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;옮긴 노드에 자식이 없으면 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;'자식 노드가 없는 노드의 삭제 순서'에 따라 노드를 삭제합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;옮긴 노드에 자식이 1개만 있으면 &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;'자식 노드가 1개 있는 노드의 삭제 순서'에 따라 노드를 삭제합니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1690226640711&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 이진탐색트리와 키가 주어지면 키가 저장된 노드를 삭제하고
// 새로운 루트 노드를 반환
TreeNode* delete_node(TreeNode* root, int key)
{
	if (root == NULL) return root;

	// 만약 키가 루트보다 작으면 왼쪽 서브 트리에 존재
	if (key &amp;lt; root-&amp;gt;key)
		root-&amp;gt;left = delete_node(root-&amp;gt;left, key);
	// 만약 키가 루트보다 크면 오른쪽 서브 트리에 존재
	else if (key &amp;gt; root-&amp;gt;key)
		root-&amp;gt;right = delete_node(root-&amp;gt;right, key);
        
	// 키가 루트와 같으면 이 노드를 삭제
	else {
		if (root-&amp;gt;left == NULL) {
			TreeNode* temp = root-&amp;gt;right;
			free(root);
			return temp;
		}
		else if (root-&amp;gt;right == NULL) {
			TreeNode* temp = root-&amp;gt;left;
			free(root);
			return temp;
		}
		else {
			TreeNode* temp = min_value_node(root-&amp;gt;right);

			// 후계 노드를 복사
			root-&amp;gt;key = temp-&amp;gt;key;
			// 후계 노드를 삭제
			root-&amp;gt;right = delete_node(root-&amp;gt;right, temp-&amp;gt;key);
		}
	}
	return root;
}

TreeNode* min_value_node(TreeNode* node)
{
	TreeNode* current = node;

	// 맨 왼쪽 단말 노드를 찾으러 내려감
	while (current-&amp;gt;left != NULL)
		current = current-&amp;gt;left;

	return current;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>coding</category>
      <category>이진탐색트리</category>
      <category>자료구조</category>
      <author>rokaf6444</author>
      <guid isPermaLink="true">https://rokaf6444.tistory.com/13</guid>
      <comments>https://rokaf6444.tistory.com/13#entry13comment</comments>
      <pubDate>Tue, 25 Jul 2023 06:00:13 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 이진트리와 이진탐색트리</title>
      <link>https://rokaf6444.tistory.com/12</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RCpLv/btsnZZjyxPf/tHUPSzDWmv9ODc3YoFnNm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RCpLv/btsnZZjyxPf/tHUPSzDWmv9ODc3YoFnNm0/img.png&quot; data-alt=&quot;출처 : 트리(그래프) - 나무위키 (namu.wiki)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RCpLv/btsnZZjyxPf/tHUPSzDWmv9ODc3YoFnNm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRCpLv%2FbtsnZZjyxPf%2FtHUPSzDWmv9ODc3YoFnNm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;337&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 트리(그래프) - 나무위키 (namu.wiki)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이번 글에서는 이진트리와 이진탐색트리를 살펴보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;이진트리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;노드가 왼쪽 자식과 오른쪽 자식을 갖는 트리를 이진트리(binary tree)라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이때 각 노드의 자식은 2명 이하만 유지해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이진트리의 특징은 왼쪽 자식과 오른쪽 자식을 구분한다는 점입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;예를 들어 위의 그림에서 노드 A의 왼쪽 자식은 B, 오른쪽 자식은 C입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이때 왼쪽 자식을 다시 루트로 하는 서브 트리를 왼쪽 서브 트리(left subtree), 오른쪽 자식을 다시 루트로 하는 서브 트리를 오른쪽 서브 트리(right subtree)라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;완전이진트리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;루트부터 노드가 채워져 있으면서 같은 레벨에서는 왼쪽에서 오른쪽으로 노드가 채워져 있는 이진트리를 완전이진트리(complete binary tree)라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위의 그림을 보면서 '채우다'라는 말의 의미와 함께 좀 더 자세히 살펴보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 마지막 레벨을 제외한 레벨은 노드를 가득 채웁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 마지막 레벨은 왼쪽부터 오른쪽 방향으로 노드를 채우되 반드시 끝까지 채울 필요는 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;완전이진트리에서 너비 우선 탐색을 하며 각 노드에 0, 1, 2, ... 값을 주면 배열에 저장하는 인덱스와 일대일로 대응한다는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;높이가 k인 완전이진트리가 가질 수 있는 노드의 최댓값은 2^(k+1) - 1개입니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;따라서 n개의 노드를 저장할 수 있는 완전이진트리의 높이는 log n입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;이진탐색트리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이진탐색트리(binary Search tree)는 이진트리가 다음 조건을 만족하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. 어떤 노드 N을 기준으로 왼쪽 서브 트리 노드의 모든 키 값은 노드 N의 키 값보다 작아야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. 오른쪽 서브 트리 노드의 키 값은 노드 N의 키 값보다 커야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. 같은 키 값을 갖는 노드는 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이진탐색트리는 중위 순회를 하면 키 값의 오름차순으로 노드를 얻을 수 있다는 점과 구조가 단순하다는 점,&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이진탐색과 비슷한 방식으로 검색이 가능하다는 점,&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;노드의 삽입이 쉽다는 점 등의 특징이 있어 폭넓게 사용됩니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>coding</category>
      <category>이진탐색트리</category>
      <category>이진트리</category>
      <category>자료구조</category>
      <author>rokaf6444</author>
      <guid isPermaLink="true">https://rokaf6444.tistory.com/12</guid>
      <comments>https://rokaf6444.tistory.com/12#entry12comment</comments>
      <pubDate>Tue, 18 Jul 2023 03:00:48 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 트리</title>
      <link>https://rokaf6444.tistory.com/11</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZwNxm/btsn0Ee7bQq/IYuB3GNMsWZWuNziqdUDv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZwNxm/btsn0Ee7bQq/IYuB3GNMsWZWuNziqdUDv0/img.png&quot; data-alt=&quot;출처 : 트리(그래프) - 나무위키 (namu.wiki)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZwNxm/btsn0Ee7bQq/IYuB3GNMsWZWuNziqdUDv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZwNxm%2Fbtsn0Ee7bQq%2FIYuB3GNMsWZWuNziqdUDv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;337&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : 트리(그래프) - 나무위키 (namu.wiki)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이번 글에서는 데이터 사이의 계층 관계를 나타내는 자료구조인 트리를 살펴보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;트리 관련 용어&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;트리를 구성하는 요소는 노드(node)와 가지(edge)입니다. 각각의 노드는 가지를 통해 다른 노드와 연결되어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;루트&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;트리의 가장 윗부분에 위치하는 노드를 루트(root)라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하나의 트리에는 하나의 루트가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;식물의 나무에도 루트가 1개인 것과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;트리 구조를 거꾸로 보면 나무 모양과 비슷하다는 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;리프&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;트리의 가장 아랫부분에 위치하는 노드를 리프(leaf)라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이때 '가장 아래에 위치한다'라는 말은 물리적으로 가장 아랫부분에 위치한다는 의미가 아니라 더 이상 뻗어나갈 수 없는 마지막에 노드가 위치한다는 의미입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다른 용어로는 끝 노드(terminal node) 또는 바깥 노드(external node)라고도 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;안쪽 노드&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;루트를 포함하여 리프를 제외한 노드를 안쪽 노드라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다른 용어로는 끝이 아닌 노드(non-terminal node)라고도 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;자식&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;어떤 노드로부터 가지로 연결된 아래쪽 노드를 자식(child)이라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;노드는 자식을 여러 개 가질 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;예를 들어 B는 두 개, H는 0개의 자식을 가지고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;리프는 자식을 가질 수 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;부모&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;어떤 노드에서 가지로 연결된 위쪽 노드를 부모(parent)라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;노드는 1개의 부모를 가집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;예를 들어 D의 부모는 B입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;루트는 부모를 가질 수 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;형제&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;같은 부모를 가지는 노드를 형제(sibling)라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;조상&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;어떤 노드에서 가지로 연결된 위쪽 노드 모두를 조상(ancestor)이라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;자손&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;어떤 노드에서 가지로 연결된 아래쪽 노드 모두를 자손(descendant)이라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;레벨&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;루트로부터 얼마나 떨어져 있는지에 대한 값을 레벨(level)이라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;루트의 레벨은 0이고 루트로부터 가지가 하나씩 아래로 뻗어나갈 때마다 레벨이 1씩 늘어납니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;차수&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;노드가 가지는 자식의 수를 차수(degree)라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;예를 들어 C의 차수는 2, F의 차수는 0입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;모든 노드의 차수가 0 이하인 트리를 n진 트리라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;앞의 그림과 같이 모든 노드의 자식 수가 2개 이하인 경우는 특별히 이진트리라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;높이&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;루트부터 가장 멀리 떨어진 리프까지의 거리(리프 레벨의 최댓값)를 높이(height)라고 합니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그림의 높이는 3입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;서브 트리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;트리 안에서 다시 어떤 노드를 루트로 정하고 그 자손으로 이루어진 트리를 서브 트리(subtree)라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;널 트리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;노드, 가지가 없는 트리를 널 트리(null tree)라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;순서 트리와 무순서 트리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;형제 노드의 순서가 있는지 없는지에 따라 트리를 두 종류로 분류합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;형제 노드의 순서를 따지면 순서 트리(orderde tree), 따지지 않으면 무순서 트리(unordered tree)라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;순서 트리 탐색&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;순서 트리의 노드를 스캔하는 방법은 두 가지입니다. 위의 트리를 예로 들어 살펴보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;너비 우선 탐색 - Queue&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;너비 우선 탐색(breadth-first Search)은 낮은 레벨에서 시작해 왼쪽에서 오른쪽 방향으로 검색하고 한 레벨에서의 검색이 끝나면 다음 레벨로 내려갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위의 그림에서 검색 순서는 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;A -&amp;gt; B -&amp;gt; C -&amp;gt; D -&amp;gt; E -&amp;gt; F -&amp;gt; G -&amp;gt; H -&amp;gt; I&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;깊이 우선 탐색 - Stack&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;깊이 우선 탐색(depth-first Search)은 리프까지 내려가면서 검색하는 것을 우선순위로 하는 탐색 방법입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;리프에 도달해 더 이상 검색을 진행할 곳이 없는 경우에는 부모에게 돌아갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그런 다음 다시 자식 노드로 내려갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;두 자식 가운데 한쪽(또는 양쪽)이 없으면 노드를 지나가는 횟수가 줄어들겠지만 노드를 지나가는 최댓값은 3회입니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1. D에서 H로 내려가며 D를 지나갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2. H에서 I로 지나가며 D를 지나갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3. I에서 D로 되돌아오면서 D를 지나갑니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그런데 깊이 우선 탐색을 진행하면서 '언제 노드를 방문할지'는 다음과 같이 세 종류로 구분합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;친구의 집도 지나치는 것과 직접 방문하는 것은 다릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이와 마찬가지로 깊이 우선 탐색도 지나가는 것과 방문하는 것을 구분해서 생각합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;전위 순회(Preorder)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;전위 순회는 아래와 같은 방법으로 깊이 우선 탐색을 진행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;노드 방문 -&amp;gt; 왼쪽 자식 -&amp;gt; 오른쪽 자식&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그림 : A -&amp;gt; B -&amp;gt; D -&amp;gt; H -&amp;gt; I -&amp;gt; E -&amp;gt; C -&amp;gt; F -&amp;gt; G&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;중위 순회(Inorder)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;중위 순회는 아래와 같은 방법으로 깊이 우선 탐색을 진행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;왼쪽 자식 -&amp;gt; 노드 방문 -&amp;gt; 오른쪽 자식&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그림 : H -&amp;gt; D -&amp;gt; I -&amp;gt; B -&amp;gt; E -&amp;gt; A -&amp;gt; F -&amp;gt; C -&amp;gt; G&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;후위 순회(Postorder)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;후위 순회는 다음과 같은 방법으로 깊이 우선 탐색을 진행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;왼쪽 자식 -&amp;gt; 오른쪽 자식 -&amp;gt; (돌아와) 노드 방문&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그림 : H -&amp;gt; I -&amp;gt; D -&amp;gt; E -&amp;gt; B -&amp;gt; F -&amp;gt; G -&amp;gt; C -&amp;gt; A&lt;/span&gt;&lt;/p&gt;</description>
      <category>coding</category>
      <category>자료구조</category>
      <category>트리</category>
      <author>rokaf6444</author>
      <guid isPermaLink="true">https://rokaf6444.tistory.com/11</guid>
      <comments>https://rokaf6444.tistory.com/11#entry11comment</comments>
      <pubDate>Tue, 18 Jul 2023 03:00:29 +0900</pubDate>
    </item>
    <item>
      <title>[쉽게 풀어쓴 C언어 Express] 9일 차</title>
      <link>https://rokaf6444.tistory.com/10</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;01. 문자열을 받아서 문자열에 포함된 문자를 대문자로 변환하는 함수 str_upper(char *s)를 작성하고 테스트하라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672345385136&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

void str_upper(char *s) {
	for (int i = 0; s[i] != '\0'; i++) { // 문자열이 끝나면 중단
		if (s[i] &amp;gt;= 'a' &amp;amp;&amp;amp; s[i] &amp;lt;= 'z') {
			s[i] -= 32; // 대문자와 소문자의 아스키 코드값 차이 : 32
		}
	}
}
int main() {
	char myString[1000];

	printf(&quot;문자열을 입력하시오: &quot;);
	scanf(&quot;%s&quot;, myString); // myString 배열에 입력
	str_upper(myString);
	printf(&quot;변환된 문자열: %s\n&quot;, myString);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672345415256&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;문자열을 입력하시오: abcdef
변환된 문자열: ABCDEF&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;02. 구조체를 이용하여 복소수를 다음과 같이 정의하고 복소수의 덧셈을 수행하는 함수를 작성하고 테스트하라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;struct complex {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;double real;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;double imag;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;};&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;struct complex complex_add(struct complex c1, struct complex c2){ &lt;span style=&quot;color: #666666;&quot;&gt;⋯ &lt;/span&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672345579032&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

struct complex {
	double real; // 실수부
	double imag; // 허수부
};
struct complex complex_add(struct complex c1, struct complex c2) {
	struct complex result;

	result.real = c1.real + c2.real; // 실수부의 합
	result.imag = c1.imag + c2.imag; // 허수부의 합

	return result;
}
int main() {
	struct complex c1;
	struct complex c2;
	struct complex c3;

	printf(&quot;1번 복소수의 실수부와 허수부를 입력하세요(실수부,허수부) : &quot;);
	scanf(&quot;%lf,%lf&quot;, &amp;amp;c1.real, &amp;amp;c1.imag);
	printf(&quot;2번 복소수의 실수부와 허수부를 입력하세요(실수부,허수부) : &quot;);
	scanf(&quot;%lf,%lf&quot;, &amp;amp;c2.real, &amp;amp;c2.imag);

	c3 = complex_add(c1, c2);
	printf(&quot;%lf+%lfi\n&quot;, c3.real, c3.imag);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672345652072&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1번 복소수의 실수부와 허수부를 입력하세요(실수부,허수부) : 1,2
2번 복소수의 실수부와 허수부를 입력하세요(실수부,허수부) : 2,3
3.000000+5.000000i&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;03. equal() 함수를 다음과 같이 구조체의 포인터를 받도록 변경하여서 작성하고 테스트하라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int equal(struct point *p1, struct point *p2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672347037418&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

struct point { // 점의 좌표 표현하는 구조체
	int x, y;
};
int equal(struct point* p1, struct point* p2) { // 두 점이 같은 좌표를 가지는지 판단하는 함수
	if (p1-&amp;gt;x == p2-&amp;gt;x &amp;amp;&amp;amp; p1-&amp;gt;y == p2-&amp;gt;y) { // 구조체 포인터를 통하여 접근할 때는 p-&amp;gt;x1과 같이 접근
		return 1;
	}
	return 0;
}
int main() {
	point p1, p2;

	printf(&quot;1번 점의 좌표 입력(x1,y1) : &quot;);
	scanf(&quot;%d,%d&quot;, &amp;amp;p1.x, &amp;amp;p1.y);
	printf(&quot;2번 점의 좌표 입력(x2,y2) : &quot;);
	scanf(&quot;%d,%d&quot;, &amp;amp;p2.x, &amp;amp;p2.y);

	if (equal(&amp;amp;p1, &amp;amp;p2) == 1)
		printf(&quot;(%d, %d) == (%d, %d)\n&quot;, p1.x, p1.y, p2.x, p2.y);
	else
		printf(&quot;(%d, %d) != (%d, %d)\n&quot;, p1.x, p1.y, p2.x, p2.y);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672347088161&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1번 점의 좌표 입력(x1,y1) : 1,2
2번 점의 좌표 입력(x2,y2) : 3,5
(1, 2) != (3, 5)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>coding</category>
      <category>9일 차</category>
      <category>C언어</category>
      <category>쉽게 풀어쓴 C언어 Express</category>
      <author>rokaf6444</author>
      <guid isPermaLink="true">https://rokaf6444.tistory.com/10</guid>
      <comments>https://rokaf6444.tistory.com/10#entry10comment</comments>
      <pubDate>Tue, 3 Jan 2023 02:30:33 +0900</pubDate>
    </item>
    <item>
      <title>[쉽게 풀어쓴 C언어 Express] 8일 차</title>
      <link>https://rokaf6444.tistory.com/9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;01. 2차원 행렬(matrix)에 대한 다음과 같은 함수를 작성하고 테스트하여 보라. 행렬의 크기는 3x3으로 가정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;scalar_mult(int a[][3], int scalar)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7xLNN/btrUVjKOa2h/nB0zpOxo9KlHkpwva4EX5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7xLNN/btrUVjKOa2h/nB0zpOxo9KlHkpwva4EX5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7xLNN/btrUVjKOa2h/nB0zpOxo9KlHkpwva4EX5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7xLNN%2FbtrUVjKOa2h%2FnB0zpOxo9KlHkpwva4EX5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;77&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672342733758&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

void scalar_mult(int a[][3], int scalar) {
	for (int i = 0; i &amp;lt; 3; i++) {
		for (int j = 0; j &amp;lt; 3; j++) {
			a[i][j] = scalar * a[i][j]; // 행렬의 모든 값에 2를 곱하는 과정
		}
	}
	for (int i = 0; i &amp;lt; 3; i++) {
		for (int j = 0; j &amp;lt; 3; j++) {
			printf(&quot;%d &quot;, a[i][j]); // 바뀐 행렬을 시각화
		}
		printf(&quot;\n&quot;);
	}
}
int main() {
	int a[3][3] = {
		{1, 2, 3},
		{4, 5, 6},
		{7, 8, 9}
	};
	scalar_mult(a, 2); // 배열 a와 곱할 값인 2를 넘기는 과정

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672342856550&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;2 4 6
8 10 12
14 16 18&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;02. 2차원 행렬(matrix)에 대한 다음과 같은 함수를 작성하고 테스트하여 보라. 행렬의 크기는 3x3으로 가정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;transpose(int a[][3], int b[][3])&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dH8mac/btrUSAl0qYq/YKrB3RQJuBSGgSaSCQXOVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dH8mac/btrUSAl0qYq/YKrB3RQJuBSGgSaSCQXOVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dH8mac/btrUSAl0qYq/YKrB3RQJuBSGgSaSCQXOVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdH8mac%2FbtrUSAl0qYq%2FYKrB3RQJuBSGgSaSCQXOVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;98&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672342962228&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

void transpose(int a[][3], int b[][3]) {
	for (int i = 0; i &amp;lt; 3; i++) {
		for (int j = 0; j &amp;lt; 3; j++) {
			b[j][i] = a[i][j]; // i와 j의 위치 교환을 통해 대각선 기준으로 값이 교환
		}
	}
}
int main() {
	int a[3][3] = {
		{1, 2, 3},
		{4, 5, 6},
		{7, 8, 9}
	};
	int b[3][3] = { 0, 0, 0 }; // 배열 초기화

	transpose(a, b);

	for (int i = 0; i &amp;lt; 3; i++) {
		for (int j = 0; j &amp;lt; 3; j++) {
			printf(&quot;%d &quot;, b[i][j]); // 값이 들어간 배열 b를 시각화
		}
		printf(&quot;\n&quot;);
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672342984964&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1 4 7
2 5 8
3 6 9&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;03. 2개의 정수의 합과 차를 동시에 반환하는 함수를 작성하고 테스트하라. 포인터 매개 변수를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void get_sum_diff (int x, int y, int *p_sum, int *p_diff) {&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;⋯&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672343356254&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

void get_sum_diff(int x, int y, int* p_sum, int* p_diff) {
	*p_sum = x + y; // sum이 저장된 공간에 직접 접근하여 값을 입력
	*p_diff = x - y; // diff가 저장된 공간에 직접 접근하여 값을 입력
}
int main() {
	int sum = 0, diff = 0; // 생성한 변수의 값을 초기화

	get_sum_diff(100, 200, &amp;amp;sum, &amp;amp;diff); // 주소값을 보내야 직접 접근하여 값을 입력 가능

	printf(&quot;원소들의 합=%d\n&quot;, sum);
	printf(&quot;원소들의 차=%d\n&quot;, diff);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672343380349&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;원소들의 합=300
원소들의 차=-100&lt;/code&gt;&lt;/pre&gt;</description>
      <category>coding</category>
      <category>8일 차</category>
      <category>C언어</category>
      <category>쉽게 풀어쓴 C언어 Express</category>
      <author>rokaf6444</author>
      <guid isPermaLink="true">https://rokaf6444.tistory.com/9</guid>
      <comments>https://rokaf6444.tistory.com/9#entry9comment</comments>
      <pubDate>Mon, 2 Jan 2023 02:30:04 +0900</pubDate>
    </item>
    <item>
      <title>[쉽게 풀어쓴 C언어 Express] 7일 차</title>
      <link>https://rokaf6444.tistory.com/8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;01. 순환 기법을 이용하여 지숫값을 계산하는 함수 power(int base, int power_raised)를 작성하라. power(2,3)가 호출되면 2^3을 계산하여 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672336599872&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

int power(int base, int power_raised) {
	int sum = 1; // sum == 모든 곱의 결과값

	for (int i = 0; i &amp;lt; power_raised; i++)
		sum = sum * base; // base를 power_raised만큼 곱하고 sum에 저장

	return sum; // 함수의 결과값을 반환
}

int main() {
	int base, power_rasied; // 각각 밑수와 지수

	printf(&quot;밑수: &quot;);
	scanf(&quot;%d&quot;, &amp;amp;base);
	printf(&quot;지수: &quot;);
	scanf(&quot;%d&quot;, &amp;amp;power_rasied);

	int result = power(base, power_rasied);
	printf(&quot;%d^%d = %d&quot;, base, power_rasied, result);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672336791545&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;밑수: 2
지수: 10
2^10 = 1024&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;02. 주어진 정수가 몇 개의 자릿수를 가지고 있는지 계산하는 프로그램을 순환을 이용하여 작성해보자. 예를 들어서 12345의 경우에는 5가 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672336921952&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

int number_size(int number) {
	int size;

	if (number == 0) {
		return 0; // 10으로 나눌 값이 0 -&amp;gt; 자릿수 계산이 끝남, 반환값은 0
	}
	else
	size = number_size(number / 10) + 1; // 일의 자릿수 제거, 자릿수 1씩 측정

	return size;
}

int main() {
	int number, answer; // scanf로 값을 입력, number 값 초기화 불필요

	printf(&quot;정수를 입력하시오: &quot;);
	scanf(&quot;%d&quot;, &amp;amp;number); // 자릿수를 구할 정수값을 입력

	answer = number_size(number);
	printf(&quot;자릿수의 개수: %d&quot;, answer);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672336976760&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;정수를 입력하시오: 12345
자릿수의 개수: 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;03. 다음과 같은 수식의 값을 계산하는 순환적인 프로그램을 작성하라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1/1 + 1/2 + 1/3 + &lt;span&gt;⋯ + 1/n&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672337117919&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

double func_sum(int n) {
	double sum = 0; // 실수 변수 필요

	if (n == 1) {
		return 1;
	}
	sum = func_sum(n - 1) + 1.0 / n; // 점점 쉬워지는 방향

	return sum;
	}

int main() {
	int user; // 입력한 값
	double result; // 수식의 값

	printf(&quot;n의 값: &quot;);
	scanf(&quot;%d&quot;, &amp;amp;user);

	result = func_sum(user);
	printf(&quot;%lf&quot;, result);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672337144305&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n의 값: 10
2.928968&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;04. 순환 호출을 이용하여 피보나치수열을 계산해 보자. 피보나치수열이란 다음과 같이 정의되는 수열이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;n = 0}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fib(n) = {1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;n = 1}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{fib(n - 1) + fib(n - 1)&amp;nbsp; &amp;nbsp; otherwise}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 일반적인 경우, 앞의 두 개의 숫자를 더해서 뒤의 숫자를 만들면 된다. 정의에 따라 수열을 만들어 보면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672340297875&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

int fib(int n) {
	if (n == 0) {
		return 0; // fib(0) = 0
	}
	if (n == 1) {
		return 1; // fib(1) = 1
	}
	else {
		int answer = fib(n - 2) + fib(n - 1); // fib(n) = fib(n - 2) + fib(n - 1) -&amp;gt; n = 0, 1 제외

		return answer;
	}
}

int main() {
	int user;

	printf(&quot;정수를 입력하시오: &quot;);
	scanf(&quot;%d&quot;, &amp;amp;user);

	for (int i = 0; i &amp;lt;= user; i++) { // 사용자가 입력한 정수까지 출력
		printf(&quot;fib(%d)=%d\n&quot;, i, fib(i));
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672340317499&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;정수를 입력하시오: 15
fib(0)=0
fib(1)=1
fib(2)=1
fib(3)=2
fib(4)=3
fib(5)=5
fib(6)=8
fib(7)=13
fib(8)=21
fib(9)=34
fib(10)=55
fib(11)=89
fib(12)=144
fib(13)=233
fib(14)=377
fib(15)=610&lt;/code&gt;&lt;/pre&gt;</description>
      <category>coding</category>
      <category>7일 차</category>
      <category>C언어</category>
      <category>쉽게 풀어쓴 C언어 Express</category>
      <author>rokaf6444</author>
      <guid isPermaLink="true">https://rokaf6444.tistory.com/8</guid>
      <comments>https://rokaf6444.tistory.com/8#entry8comment</comments>
      <pubDate>Sun, 1 Jan 2023 02:30:39 +0900</pubDate>
    </item>
    <item>
      <title>[쉽게 풀어쓴 C언어 Express] 6일 차</title>
      <link>https://rokaf6444.tistory.com/7</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;01. 0 또는 1 값을 무작위로 반환하는 coin_rand() 함수를 작성하여 간단한 동전 던지기 게임을 시뮬레이션하여 보자. 컴퓨터가 동전을 던지고 사용자는 앞뒤를 말한다. 컴퓨터는 coin_rand()를 이용하여 생성된 난수가 1이면 동전의 앞면으로 간주하고 0이면 동전의 뒷면으로 간주한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668230304812&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;time.h&amp;gt;

int coin_rand() {
	int coin;

	srand(time(NULL));
	coin = rand() % 2;

	return 0;
}
int main() {
	while (1) {
		int coin = 0, user = 0;
		char go = 0, y = 0, n = 0;

		coin_rand();
		printf(&quot;앞면 또는 뒷면(1 또는 0):&quot;);
		scanf(&quot;%d&quot;, &amp;amp;user);

		if (coin == user) {
			printf(&quot;맞았습니다.&quot;);
		}
		else {
			printf(&quot;틀렸습니다.&quot;);
		}
		printf(&quot;\n계속하시겠습니까?(y 또는 n):&quot;);
		getchar();
		scanf(&quot;%c&quot;, &amp;amp;go);

		if (go == 'n')
			break;

		else if (go == 'y')
			continue;
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668230367278&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;앞면 또는 뒷면(1 또는 0):1
틀렸습니다.
계속하시겠습니까?(y 또는 n):y
앞면 또는 뒷면(1 또는 0):0
맞았습니다.
계속하시겠습니까?(y 또는 n):y
앞면 또는 뒷면(1 또는 0):&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;02. 화면에 가로로 막대그래프를 그리는 프로그램을 작성하여 보자. 인수의 값만큼의 별표 문자를 출력하는 함수 print_star(int n)를 작성하라. 반복적으로 사용자로부터 값을 입력받아서 print_star()를 호출하여 입력값만큼 막대를 그리는 프로그램을 완성하라. 사용자가 음수를 입력하면 반복을 중단하라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668233939466&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

void print_star(int n);

int main() {
	int n;
	
	while (1) {
		printf(&quot;\n값을 입력하시오(종료는 음수): &quot;);
		scanf(&quot;%d&quot;, &amp;amp;n);

		if (n &amp;lt; 0) {
			break;
		}
		print_star(n);
	}
	return 0;
}

void print_star(int n) {
	for (int i = 0; i &amp;lt; n; i++) {
		printf(&quot;*&quot;);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668234001898&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;값을 입력하시오(종료는 음수): 5
*****
값을 입력하시오(종료는 음수): 10
**********
값을 입력하시오(종료는 음수): -1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;03. 오일러의 수 e는 자연로그의 밑수로 사용된다. 이 값은 다음과 같은 식에 의하여 근사치를 구할 수 있다. 팩토리얼 값을 계산하는 함수 factorial()을 작성하고 오일러의 수를 계산하는 프로그램을 작성하라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;e = 1 + 1/1! + 1/2! + 1/3! + &lt;span&gt;⋯&lt;/span&gt;&amp;nbsp;+ 1/n!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668234126778&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

int factorial(int user);

int main() {
	int user;
	double e = 1;

	printf(&quot;어디까지 계산할까요: &quot;);
	scanf(&quot;%d&quot;, &amp;amp;user);

	for(int i = 1; i &amp;lt;= user; i++)
		e  = e + 1.0 / factorial(i);

	printf(&quot;오일러의 수는 %lf입니다.&quot;, e);

	return 0;
}

int factorial(int user) {
	if (user == 1)
		return user;

	else
		return (user * factorial(user - 1));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668234164211&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;어디까지 계산할까요: 30
오일러의 수는 2.718282입니다&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;04. 두 개의 부동 소수점 수가 근사적으로 같은 값이면 1을 반환하고 근사적으로 같지 않으면 0을 넘겨주는 함수 math_equal(a, b)을 작성하시오. 근사적으로 같다고 하는 것은 다음의 부등식을 만족하는 경우라고 가정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;|a - b| / min(|a|,|b|) &amp;lt; e&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부동 소수점 수의 절대값을 구하는 함수와 두수 중에서 최솟값을 찾는 함수는 라이브러리 함수를 이용하라. e는 상수로서 0.000001로 정의된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668234350069&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;math.h&amp;gt;
#define e 0.000001

double math_equal(double a, double b);
double min(double a, double b);

int main() {
	double a, b;

	printf(&quot;실수를 입력하시오: &quot;);
	scanf_s(&quot;%lf&quot;, &amp;amp;a);
	printf(&quot;실수를 입력하시오: &quot;);
	scanf_s(&quot;%lf&quot;, &amp;amp;b);

	math_equal(a, b);

	return 0;
}

double min(double a, double b) {
	double c = a - b;

	if (c == a - b) {
		return b;
	}

	if (c == b - a) {
		return a;
	}
}

double math_equal(double a, double b) {
	double c = a - b;

	if ((fabs(c) / (min(fabs(a), fabs(b))) &amp;lt; e)) {
		printf(&quot;두 개의 실수는 서로 같음&quot;);

		return 0;
	}

	if ((fabs(c) / (min(fabs(a), fabs(b))) &amp;gt;= e)) {
		printf(&quot;두 개의 실수는 서로 다름&quot;);

		return 1;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668234379739&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;실수를 입력하시오: 1.2345
실수를 입력하시오: 1.2346
두 개의 실수는 서로 다름&lt;/code&gt;&lt;/pre&gt;</description>
      <category>coding</category>
      <category>6일 차</category>
      <category>C언어</category>
      <category>쉽게 풀어쓴 C언어 Express</category>
      <author>rokaf6444</author>
      <guid isPermaLink="true">https://rokaf6444.tistory.com/7</guid>
      <comments>https://rokaf6444.tistory.com/7#entry7comment</comments>
      <pubDate>Wed, 16 Nov 2022 02:30:25 +0900</pubDate>
    </item>
    <item>
      <title>[쉽게 풀어쓴 C언어 Express] 5일 차</title>
      <link>https://rokaf6444.tistory.com/6</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;01. 컴퓨터는 막대그래프를 그리는 데도 사용된다. 사용자로부터 1부터 50사이의 숫자를 입력 받아서 숫자만큼의 별표를 출력하는 프로그램을 작성하라. 막대는 가로로 그려지게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668227442156&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

int main() {
	int height;

	while (1) {
		printf(&quot;막대의 높이(종료 -1): &quot;);
		scanf(&quot;%d&quot;, &amp;amp;height);

		if (height == -1)
			break;

		if (height == 0 || height &amp;lt; -1 || height &amp;gt; 50) {
			printf(&quot;1부터 50까지의 숫자만 입력 가능합니다.&quot;);
			break;
		}

		for (int i = 0; i &amp;lt; height; i++) {
			printf(&quot;*&quot;);
		}
		printf(&quot;\n&quot;);
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668228270086&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;막대의 높이(종료 -1): 7
*******
막대의 높이(종료 -1): 18
******************
막대의 높이(종료 -1): 20
********************
막대의 높이(종료 -1):&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;02. 피보나치수열은 다음과 같이 정의되는 수열이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;f(0) = 0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;f(1) = 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;f(i+1) = f(i) + f(i-1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for i = 1, 2, ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;피보나치수열에서는 앞의 2개의 원소를 합하여 뒤의 원소를 만든다. 피보나치수열은 컴퓨터에서도 탐색 문제 등에 사용되기도 한다. 피보나치수열을 생성하여 출력하는 프로그램을 작성하여 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668227592334&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

int main() {
	int a = 0, b = 1;
	int c, n;

	printf(&quot;몇번째 항까지 구할까요? &quot;);
	scanf(&quot;%d&quot;, &amp;amp;n);

	if (n == 1)
		printf(&quot;%d&quot;, a);

	if (n == 2)
	printf(&quot;%d, %d&quot;, a, b);

	if (n &amp;gt;= 3) {
		printf(&quot;%d, %d, &quot;, a, b);
		for (int i = 0; i &amp;lt; n - 1; i++) {
			c = a + b;
			printf(&quot;%d, &quot;, c);
			a = b;
			b = c;
		}
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668228222887&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;몇번째 항까지 구할까요? 10
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;03. 사용자가 입력한 특정한 정수의 자릿수를 반대로 출력하는 프로그램을 작성하라. 예를 들어서 사용자가 정수 1206을 입력하였다면 6021이 출력되어야 한다. do&amp;hellip;while 문을 사용하여 보라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668227875661&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

int main() {
	int num;

	printf(&quot;정수를 입력하시오: &quot;);
	scanf(&quot;%d&quot;, &amp;amp;num);

	do {
		printf(&quot;%d&quot;, num % 10);
		num = num / 10;
	} while (num &amp;gt; 0);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668228167333&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;정수를 입력하시오: 123456
654321&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;04. 사용자에게 숫자를 입력 받고, 해당 숫자의 줄만큼 * 기호를 출력하는 프로그램을 작성하라. 아래와 같이 정렬되어 출력되도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정수를&amp;nbsp;입력하세요:&amp;nbsp;1 &lt;br /&gt;* &lt;br /&gt;정수를&amp;nbsp;입력하세요:&amp;nbsp;2 &lt;br /&gt;&amp;nbsp;* &lt;br /&gt;*&amp;nbsp;* &lt;br /&gt;정수를&amp;nbsp;입력하세요:&amp;nbsp;3 &lt;br /&gt;&amp;nbsp;&amp;nbsp;* &lt;br /&gt;&amp;nbsp;*&amp;nbsp;* &lt;br /&gt;*&amp;nbsp;*&amp;nbsp;* &lt;br /&gt;정수를&amp;nbsp;입력하세요:&amp;nbsp;4 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;*&amp;nbsp;* &lt;br /&gt;&amp;nbsp;*&amp;nbsp;*&amp;nbsp;* &lt;br /&gt;*&amp;nbsp;*&amp;nbsp;*&amp;nbsp;* &lt;br /&gt;정수를&amp;nbsp;입력하세요:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668227989797&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;

int main() {
	int n = 0;

	while (1)
	{
		printf(&quot;정수를 입력하세요: &quot;);
		scanf(&quot;%d&quot;, &amp;amp;n);

		for (int i = 0; i &amp;lt; n; i++) { // 층수
			for (int j = n - 1; j &amp;gt; i; j--) {
				printf(&quot; &quot;);
			}

			for (int k = 0; k &amp;lt;= i; k++) {
				printf(&quot;* &quot;);
			}
			printf(&quot;\n&quot;);
		}
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668228058101&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;정수를 입력하세요: 1
*
정수를 입력하세요: 2
 *
* *
정수를 입력하세요: 3
  *
 * *
* * *
정수를 입력하세요: 4
   *
  * *
 * * *
* * * *
정수를 입력하세요:&lt;/code&gt;&lt;/pre&gt;</description>
      <category>coding</category>
      <category>5일 차</category>
      <category>C언어</category>
      <category>쉽게 풀어쓴 C언어 Express</category>
      <author>rokaf6444</author>
      <guid isPermaLink="true">https://rokaf6444.tistory.com/6</guid>
      <comments>https://rokaf6444.tistory.com/6#entry6comment</comments>
      <pubDate>Tue, 15 Nov 2022 02:30:33 +0900</pubDate>
    </item>
  </channel>
</rss>