<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>sik13579 님의 블로그</title>
    <link>https://sik13579.tistory.com/</link>
    <description>sik13579 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Thu, 14 May 2026 10:47:21 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>sik13579</managingEditor>
    <item>
      <title>[LFS17] xz 패키지 빌드</title>
      <link>https://sik13579.tistory.com/66</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Xz 패키지 역할&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Xz는 데이터에서 반복되는 패턴을 찾아내어 극단적으로 크기를 줄여준다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;높은 압출률 : gzip 이나 bzip2 보다 훨씬 더 작게 파일을 압출할 수 있다. 저장 공간이 귀한 임시 시스템이나 배포 환경에서 필수적이다.&lt;/li&gt;
&lt;li&gt;LFS에서의 역할 : 6장 이후로 넘어가면서 설치할 수많은 거대 패키지(GCC, Glibc 등)의 압축 을 풀 때, 이 xz 라이브러리와 실행 파일이 우리 시스템 안에 이미 준비되어 있어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Xz 패키지 빌드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 1. 소스 준비 및 이동 (lfs 유저)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777280123739&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $LFS/sources
tar -xvf xz-5.8.2.tar.xz 
cd xz-5.8.2&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;&lt;b&gt;2. 설정&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777280265284&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./configure --prefix=/usr                     \
            --host=$LFS_TGT                   \
            --build=$(build-aux/config.guess) \
            --disable-static                  \
            --docdir=/usr/share/doc/xz-5.6.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;&lt;b&gt;3. 컴파일 및 설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777280287866&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;make
make DESTDIR=$LFS install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt; 4. 뒷정리 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777280324716&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $LFS/sources
rm -rf xz-5.8.2&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;b&gt;5. 테스트&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777280413811&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;xz --version
echo &quot;hello LFS xz&quot; &amp;gt; xz-test.txt
xz -k xz-test.txt
ls -l xz-test.txt xz-test.txt.xz&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XxOx8/dJMcaaE7wki/wkmTxh5ixC9V9BNhbcAko1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XxOx8/dJMcaaE7wki/wkmTxh5ixC9V9BNhbcAko1/img.png&quot; data-alt=&quot;[그림1]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XxOx8/dJMcaaE7wki/wkmTxh5ixC9V9BNhbcAko1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXxOx8%2FdJMcaaE7wki%2FwkmTxh5ixC9V9BNhbcAko1%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;436&quot; height=&quot;128&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림1]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 출력되는것을 확인할 수 있습니다.&lt;/p&gt;</description>
      <category>리눅스/LFS</category>
      <author>sik13579</author>
      <guid isPermaLink="true">https://sik13579.tistory.com/66</guid>
      <comments>https://sik13579.tistory.com/66#entry66comment</comments>
      <pubDate>Mon, 27 Apr 2026 18:01:38 +0900</pubDate>
    </item>
    <item>
      <title>[LFS16] Tar 패키지 빌드</title>
      <link>https://sik13579.tistory.com/65</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Tar 패키지 역할&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tar의 역할은 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;아카이브(Archive) :&amp;nbsp;&lt;/b&gt;여러 개의 파일과 디렉토리 구조를 깨뜨리지 않고, 하나의 파일(.tar)로 묶어주는 역할만 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;압축(Compression) :&amp;nbsp;&lt;/b&gt;여기에 gzip이나 xz같은 친구들이 달라붙어 용량을 줄여주는 것&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LFS에서의 역할 :&amp;nbsp;&lt;/b&gt;나중에 chroot로 진짜 루트 권한 환경에 들어갔을 때, 거기서 새로운 패키지 소스를 풀기 위해 가장 먼저 필요한 도구&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Tar 패키지 빌드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 1. 소스 준비 및 이동 (lfs 유저)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777279694731&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $LFS/sources
tar -xvf tar-1.35.tar.xz
cd tar-1.35&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;&lt;b&gt; 2. 설정&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777279704601&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./configure --prefix=/usr                     \
            --host=$LFS_TGT                   \
            --build=$(build-aux/config.guess)&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;&lt;b&gt; 3. 컴파일 및 설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777279714908&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;make
make DESTDIR=$LFS install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;4. 뒷정리&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777279754464&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $LFS/sources
rm -rf tar-1.35&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;&lt;b&gt;5.테스트&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777279820301&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tar --version  #버전 확인
mkdir tar-test #tar 파일 생성 테스트
echo &quot;hello LFS tar&quot; &amp;gt; tar-test/hello.txt
tar -cf tar-test.tar tar-test
ls -l tar-test.tar&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byTOEB/dJMcacbPWTb/b58sfwIgwIq6AKNl6geG60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byTOEB/dJMcacbPWTb/b58sfwIgwIq6AKNl6geG60/img.png&quot; data-alt=&quot;[그림1]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byTOEB/dJMcacbPWTb/b58sfwIgwIq6AKNl6geG60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyTOEB%2FdJMcacbPWTb%2Fb58sfwIgwIq6AKNl6geG60%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;559&quot; height=&quot;216&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림1]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 설치 완료 되었습니다.&lt;/p&gt;</description>
      <category>리눅스/LFS</category>
      <category>LFS</category>
      <category>tar</category>
      <author>sik13579</author>
      <guid isPermaLink="true">https://sik13579.tistory.com/65</guid>
      <comments>https://sik13579.tistory.com/65#entry65comment</comments>
      <pubDate>Mon, 27 Apr 2026 17:51:22 +0900</pubDate>
    </item>
    <item>
      <title>[LFS15] sed 패키지 빌드</title>
      <link>https://sik13579.tistory.com/64</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Sed의 역할&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sed는 파일을 직접 열어 수정하는 일반적인 에디터(Vim, Nano)와는 작동 방식이 완전히 다르다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비파괴적인 편집 : 원본 파일을 건드리지 않고, 터미널로 출력되는 스트림을 가공해서 보여준다.(물론 -i 옵션을 쓰면 파일도 직접 고친다.)&lt;/li&gt;
&lt;li&gt;패턴 매칭 : 특정 단어가 들어간 줄만 지우거나, 정규 표현식을 사용해 복잡한 문자열 패턴을 순식간에 바꿀 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Sed 패키지 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 1. 소스 준비 및 이동 (lfs 유저) &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777279203426&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $LFS/sources
tar -xvf sed-4.9.tar.xz
cd sed-4.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;&lt;b&gt; 2. 설정&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777279214705&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./configure --prefix=/usr                   \
            --host=$LFS_TGT                 \
            --build=$(build-aux/config.guess)&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;&lt;b&gt; 3. 컴파일 및 설치 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777279224240&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;make
make DESTDIR=$LFS install&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;&lt;b&gt;4. 뒷정리&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777279236633&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $LFS/sources
rm -rf sed-4.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;&lt;b&gt;5. 테스트&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1777279306418&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sed --version
echo &quot;hello LFS&quot; | sed 's/LFS/Linux From Scratch/'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ch8P2a/dJMcafGpG9a/4ieAWZfICbKNDcJuRqUku0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ch8P2a/dJMcafGpG9a/4ieAWZfICbKNDcJuRqUku0/img.png&quot; data-alt=&quot;[그림1]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ch8P2a/dJMcafGpG9a/4ieAWZfICbKNDcJuRqUku0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fch8P2a%2FdJMcafGpG9a%2F4ieAWZfICbKNDcJuRqUku0%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;559&quot; height=&quot;287&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림1]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 버전 출력 및, 기본 동작 테스트를 완료해보았습니다.&lt;/p&gt;</description>
      <category>리눅스/LFS</category>
      <category>LFS</category>
      <category>sed</category>
      <author>sik13579</author>
      <guid isPermaLink="true">https://sik13579.tistory.com/64</guid>
      <comments>https://sik13579.tistory.com/64#entry64comment</comments>
      <pubDate>Mon, 27 Apr 2026 17:42:41 +0900</pubDate>
    </item>
    <item>
      <title>[LFS14] Python3 빌드</title>
      <link>https://sik13579.tistory.com/63</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Python3 패키지 역할&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;빌드 도구 및 자동화 기반
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;LFS 과정에서 일부 패키지들은 내부적으로 Python 스크립트를 사용해서 아래와 같은 작업을 합니다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설정(configure 보조)&lt;/li&gt;
&lt;li&gt;테스트 스위트 실행&lt;/li&gt;
&lt;li&gt;코드 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;최근 패키지들 meson, ninja, gdb, systemd 계열 등에서 Python 의존성이 있습니다.&lt;/li&gt;
&lt;li&gt;즉, 컴파일을 돕는 보조 언어 역할을 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;테스트 프레임워크 지원
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;많은 패키지에서 make check 실행 시 Python을 사용&lt;/li&gt;
&lt;li&gt;테스트 자동화 스크립트들이 Python 기반&lt;/li&gt;
&lt;li&gt;없으면 테스트 실패 또는 일부가 스킵됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시스템 유틸리티 스크립트 실행
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일부 시스템 도구들이 Python으로 작성됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: 일부 관리 스크립트, 빌드 헬퍼&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LFS이후 BLFS단계에서 더욱 중요해질 예정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Python3 패키지 구성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python3 패키지는 꽤 많은 구성 요소로 이루어져 있습니다. 간단하게 살펴보겠습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;인터프리터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Python 코드를 실행하는 핵심 엔진&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1776755486488&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3 script.py # C로 구현된 CPython&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;표준 라이브러리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Python 설치 시 기본 포함되는 라이브러리들&lt;/li&gt;
&lt;li&gt;대표적으로&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;os &amp;rarr; 파일/프로세스 제어&lt;/li&gt;
&lt;li&gt;sys &amp;rarr; 인터프리터 제어&lt;/li&gt;
&lt;li&gt;subprocess &amp;rarr; 외부 프로그램 실행&lt;/li&gt;
&lt;li&gt;socket &amp;rarr; 네트워크&lt;/li&gt;
&lt;li&gt;json, re, math 등 이있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;별도 설치 없이 바로 사용 가능하며, LFS 빌드/테스트에서 많이 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;바이트코드 시스템&lt;/li&gt;
&lt;li&gt;빌드 및 확장 모듈 시스템&lt;/li&gt;
&lt;li&gt;패키지 관리 도구&lt;/li&gt;
&lt;li&gt;개발 도구 및 유틸리티&lt;/li&gt;
&lt;li&gt;설정 및 환경 파일이 존재합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Python3 패키지 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 1. 소스 준비 및 이동 (lfs 유저)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776755899501&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $LFS/sources
tar -xvf Python-3.14.2.tar.xz 
cd Python-3.14.2&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;&lt;b&gt; 2. 설정 (Configure) &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776755913123&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./configure --prefix=/usr   \
            --enable-shared \
            --without-ensurepip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--without-ensurepip는 임시 빌드 단계에서 복잡한 패키지 관리자(pip) 설치를 생략하여 빌드 시간을 단축하고 의존성 문제를 방지하기 위함&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;b&gt; 3. 컴파일 및 설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776755943631&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;make
make DESTDIR=$LFS install&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;&lt;b&gt; 4. 뒷정리 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776755961752&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $LFS/sources
rm -rf Python-3.14.2&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;&lt;b&gt;5. 테스트&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776756139531&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python3 --version #설치가 잘 됐는지 확인
python3 -c &quot;print('hello')&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8VOTS/dJMcaa56cG0/gQfACmOIyxHaYuoozihIv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8VOTS/dJMcaa56cG0/gQfACmOIyxHaYuoozihIv0/img.png&quot; data-alt=&quot;[그림1] Python3 설치 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8VOTS/dJMcaa56cG0/gQfACmOIyxHaYuoozihIv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8VOTS%2FdJMcaa56cG0%2FgQfACmOIyxHaYuoozihIv0%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;411&quot; height=&quot;63&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;63&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림1] Python3 설치 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리눅스/LFS</category>
      <author>sik13579</author>
      <guid isPermaLink="true">https://sik13579.tistory.com/63</guid>
      <comments>https://sik13579.tistory.com/63#entry63comment</comments>
      <pubDate>Tue, 21 Apr 2026 16:22:37 +0900</pubDate>
    </item>
    <item>
      <title>[LFS13] Perl 패키지 빌드</title>
      <link>https://sik13579.tistory.com/62</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Perl 패키지 역할&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LFS에서 perl 패키지의 역할은 단순한 언어가 아니라, &lt;b&gt;시스템 빌드와 테스트를 지원하는 핵심 도구&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 역할은 아래와 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;빌드 지원(Build Support)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;configure, make 과정에서 Perl 스크립트 실행&lt;/li&gt;
&lt;li&gt;자동화된 빌드 절차 수행&lt;/li&gt;
&lt;li&gt;예:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일부 패키지의 configure 단계에서 perl 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;테스트 자동화(Test Suite 실행)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;make check 수행 시 Perl 기반 테스트 실행&lt;/li&gt;
&lt;li&gt;빌드된 프로그램의 정상 동작 검증&lt;/li&gt;
&lt;li&gt;LFS에서 &quot;정상 시스템&quot; 만들려면 테스트 통과가 핵심&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;텍스트 처리 및 스크립팅
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그 분석, 문자열 처리, 파일 파싱&lt;/li&gt;
&lt;li&gt;빌드 과정 중 데이터 가공&lt;/li&gt;
&lt;li&gt;정규표현식(regex) 처리에 매우 강함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Perl 패키지의 구성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LFS에서 설치되는 Perl 패키지는 단순 실행파일이 아닌, &lt;b&gt;완전한 스크립트 실행 환경&lt;/b&gt;으로 구성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 구성 요소는 아래와 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Perl 인터프리터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;perl 실행 파일&lt;/li&gt;
&lt;li&gt;Perl 스크립트를 실행하는 핵심 엔진&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;표준 라이브러리(Core Modules)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 제공 모듈 집합&lt;/li&gt;
&lt;li&gt;별도 설치 없이 바로 사용 가능&lt;/li&gt;
&lt;li&gt;예:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일 처리&lt;/li&gt;
&lt;li&gt;문자열 처리&lt;/li&gt;
&lt;li&gt;시스템 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CPAN 기반 모듈 구조
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Perl 패키지 확장 구조&lt;/li&gt;
&lt;li&gt;필요 시 추가 모듈 설치 가능&lt;/li&gt;
&lt;li&gt;모듈 단위로 기능 확장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유틸리티 및 빌드 도구
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Perl 관련 스크립트 도구 포함&lt;/li&gt;
&lt;li&gt;일부 패키지 빌드/테스트에 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Perl 패키지 빌드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 1. 소스 준비 및 이동 (lfs 유저) &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776753585744&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $LFS/sources
tar -xvf perl-5.42.0.tar.xz 
cd perl-5.42.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;&lt;b&gt; 2. 설정 (Configure) &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776753601653&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sh Configure -des                                        \
             -Dprefix=/usr                               \
             -Dvendorprefix=/usr                         \
             -Duseshrplib                                \
             -Dprivlib=/usr/lib/perl5/5.38/core_perl     \
             -Darchlib=/usr/lib/perl5/5.38/core_perl     \
             -Dsitelib=/usr/lib/perl5/5.38/site_perl     \
             -Dsitearch=/usr/lib/perl5/5.38/site_perl    \
             -Dvendorlib=/usr/lib/perl5/5.38/vendor_perl \
             -Dvendorarch=/usr/lib/perl5/5.38/vendor_perl&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 패키지들과는 조금 다르게 복잡한 설정을 가지고있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Perl을 /usr기준으로 설치하고, 코어 모듈/사이트 모듈/벤터 모듈은 각각 이경로에 넣으라고 설정하는 것입니다.&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;sh Configure&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Perl 패키지의 설정 스크립트를 실행&lt;/li&gt;
&lt;li&gt;현재 시스템을 검사하고&lt;/li&gt;
&lt;li&gt;Makefile같은 빌드 설정을 생성함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-des&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;질문하지 말고, 기본값 위주로, 자동으로 설정 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 3. 컴파일 및 설치 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776753805120&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;make
make DESTDIR=$LFS install&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;&lt;b&gt; 4. 뒷정리 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776753820724&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $LFS/sources
rm -rf perl-5.42.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;&lt;b&gt;5. 테스트&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776753880397&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;perl -v&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r0PYm/dJMcafTR8Pc/m8VyP6q36c4mERdgaWbkf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r0PYm/dJMcafTR8Pc/m8VyP6q36c4mERdgaWbkf0/img.png&quot; data-alt=&quot;[그림1] 정상 설치된 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r0PYm/dJMcafTR8Pc/m8VyP6q36c4mERdgaWbkf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr0PYm%2FdJMcafTR8Pc%2Fm8VyP6q36c4mERdgaWbkf0%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;637&quot; height=&quot;219&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림1] 정상 설치된 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1776753912540&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;which perl #실행 경로 확인&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Wi4Y/dJMcad2K4DW/WgBdobfX7Xja6lekma86d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Wi4Y/dJMcad2K4DW/WgBdobfX7Xja6lekma86d1/img.png&quot; data-alt=&quot;[그림2] 정상적인 경로&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Wi4Y/dJMcad2K4DW/WgBdobfX7Xja6lekma86d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Wi4Y%2FdJMcad2K4DW%2FWgBdobfX7Xja6lekma86d1%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;273&quot; height=&quot;46&quot; data-origin-width=&quot;273&quot; data-origin-height=&quot;46&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림2] 정상적인 경로&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1776753976935&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;perl -e 'print &quot;Perl OK\n&quot;;' #간단한 Perl 코드 실행 테스트&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;398&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpSrbs/dJMcaaruQTq/ZTmQ2uFjCj6yJguDyvkAZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpSrbs/dJMcaaruQTq/ZTmQ2uFjCj6yJguDyvkAZk/img.png&quot; data-alt=&quot;[그림3] 테스트 출력 이상없음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpSrbs/dJMcaaruQTq/ZTmQ2uFjCj6yJguDyvkAZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpSrbs%2FdJMcaaruQTq%2FZTmQ2uFjCj6yJguDyvkAZk%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;398&quot; height=&quot;45&quot; data-origin-width=&quot;398&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림3] 테스트 출력 이상없음&lt;/figcaption&gt;
&lt;/figure&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;</description>
      <category>리눅스/LFS</category>
      <category>LFS</category>
      <category>PERL</category>
      <author>sik13579</author>
      <guid isPermaLink="true">https://sik13579.tistory.com/62</guid>
      <comments>https://sik13579.tistory.com/62#entry62comment</comments>
      <pubDate>Tue, 21 Apr 2026 15:47:22 +0900</pubDate>
    </item>
    <item>
      <title>이진탐색트리(Binary Search Tree) - 삭제 연산</title>
      <link>https://sik13579.tistory.com/61</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이진탐색트리의 핵심은&amp;nbsp;&lt;b&gt;정렬된 상태를 유지하면서 빠르게 탐색&lt;/b&gt;하는것 입니다.&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;이 이진탐색트리는 그 중간을 노린 구조입니다.&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;1. 검색 시스템&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;값 찾기 : O(log n)&lt;/li&gt;
&lt;li&gt;예 : 사용자 ID, 세션, 키-값 조회&lt;/li&gt;
&lt;li&gt;내부적으로는 Redis 같은 시스템도 트리/해시 기반 구조를 섞여 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 정렬된 데이터 유지&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;항상 왼쪽&amp;lt; 부모 &amp;lt; 오른쪽&lt;/li&gt;
&lt;li&gt;중위 순회(inorder)하면 자동 정렬&lt;/li&gt;
&lt;li&gt;예:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그 시간순 정렬&lt;/li&gt;
&lt;li&gt;점수 랭킹 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 범위 검색(Range Query)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;10이상 50이하 데이터만 뽑고싶을때&lt;/li&gt;
&lt;li&gt;BST는 이런 범위 탐색이 효율적&lt;/li&gt;
&lt;li&gt;DB 인덱스에서 핵심 개념&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 삽입/삭제/탐색을 모두 적당히 빠르게 처리하면서 정렬 상태를 유지해야 할 때 사용하게되는 구조입니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmXITa/dJMcaf7mHKZ/qTDqNCoToB2qTkgIQKAi1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmXITa/dJMcaf7mHKZ/qTDqNCoToB2qTkgIQKAi1K/img.png&quot; data-alt=&quot;[그림1]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmXITa/dJMcaf7mHKZ/qTDqNCoToB2qTkgIQKAi1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmXITa%2FdJMcaf7mHKZ%2FqTDqNCoToB2qTkgIQKAi1K%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;638&quot; height=&quot;446&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림1]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림1]삭제하고 싶은 노드를 x, x의 자식인 왼쪽 subtree를 a, 오른쪽 subtree를 b라고 칭했을때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x자리에 a subtree를 올리고, a subtree에서 maxnode(가장 높은값을 가진 노드)아래에 b subtree를 붙입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKtWDy/dJMb990qOzq/EoQrT7EMCKutev5d7AuZqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKtWDy/dJMb990qOzq/EoQrT7EMCKutev5d7AuZqk/img.png&quot; data-alt=&quot;[그림2]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKtWDy/dJMb990qOzq/EoQrT7EMCKutev5d7AuZqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKtWDy%2FdJMb990qOzq%2FEoQrT7EMCKutev5d7AuZqk%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;538&quot; height=&quot;386&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림2]&lt;/figcaption&gt;
&lt;/figure&gt;
&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;p data-ke-size=&quot;size16&quot;&gt;이것을 Python을 이용하여 구현하면 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776667072011&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Node:  
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None
        self.parent = None

class BST:
    def __init__(self):
        self.root = None

    def deleteByMerging(self, x):
        a = x.left
        b = x.right
        pt = x.parent

        if a != None:
            c = a
            m = a
            while m.right != None:
                m = m.right
            m.right = b
            if b != None:
                b.parent = m
        else:
            c = b

        if c != None:
            c.parent = pt

        if pt != None:
            if pt.left == x:
                pt.left = c
            else:
                pt.right = c
        else:
            self.root = c
            if c != None:
                c.parent = None&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/자료구조</category>
      <author>sik13579</author>
      <guid isPermaLink="true">https://sik13579.tistory.com/61</guid>
      <comments>https://sik13579.tistory.com/61#entry61comment</comments>
      <pubDate>Mon, 20 Apr 2026 15:38:03 +0900</pubDate>
    </item>
    <item>
      <title>트리 - 힙 insert 연산</title>
      <link>https://sik13579.tistory.com/60</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 힙 이란?(다시 한 번 짚고 넘어가자)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙은&amp;nbsp;&lt;b&gt;완전이진트리 형태&lt;/b&gt;를 가지면서, 동시에&amp;nbsp;&lt;b&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;pre id=&quot;code_1776145450652&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;      10
     /  \
    8    9
   /
  7&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 완전이진트리라서 힙이 될 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1776145487568&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;      10
     /  \
    8    9
     \
      7&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 부모-자식 크기 관계는 맞아도,&amp;nbsp;&lt;b&gt;완전이진트리 모양이 아니므로 힙이 아니다.&lt;/b&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;2. insert 연산 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step1. 초기 상태 array = [ 5, 7, 9, 10, 8, 6 ]에서 make_heap()으로 정렬한다.&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;400&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p6ej5/dJMcacv0qMV/SNzEK9m0bCZPGDpULSLNP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p6ej5/dJMcacv0qMV/SNzEK9m0bCZPGDpULSLNP0/img.png&quot; data-alt=&quot;[그림1]최대 힙 상태의 트리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p6ej5/dJMcacv0qMV/SNzEK9m0bCZPGDpULSLNP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp6ej5%2FdJMcacv0qMV%2FSNzEK9m0bCZPGDpULSLNP0%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;400&quot; height=&quot;260&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림1]최대 힙 상태의 트리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step2. 마지막 위치에 insert 배열은 array = [10, 8, 9, 7, 5, 6, 14] 상태가 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wCTt1/dJMcabcKdiB/gpM9aDLVTYkuDd06STY4Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wCTt1/dJMcabcKdiB/gpM9aDLVTYkuDd06STY4Ck/img.png&quot; data-alt=&quot;[그림2] 맨 뒤에 append&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wCTt1/dJMcabcKdiB/gpM9aDLVTYkuDd06STY4Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwCTt1%2FdJMcabcKdiB%2FgpM9aDLVTYkuDd06STY4Ck%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;443&quot; height=&quot;263&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림2] 맨 뒤에 append&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step3. heapify_up 시작(핵심), 기준은 부모보다 크면 위로 올라간다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBawBU/dJMcagSG5cG/F0MsazrfFkLgCbGdDydEW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBawBU/dJMcagSG5cG/F0MsazrfFkLgCbGdDydEW1/img.png&quot; data-alt=&quot;[그림3] 아래서 부터 위로 heapify_up&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBawBU/dJMcagSG5cG/F0MsazrfFkLgCbGdDydEW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBawBU%2FdJMcagSG5cG%2FF0MsazrfFkLgCbGdDydEW1%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;429&quot; height=&quot;308&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림3] 아래서 부터 위로 heapify_up&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&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;422&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mx1WK/dJMcafsHduY/DyHL59oWHLUS6MYDqXsHk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mx1WK/dJMcafsHduY/DyHL59oWHLUS6MYDqXsHk0/img.png&quot; data-alt=&quot;[그림4] 최종 결과이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mx1WK/dJMcafsHduY/DyHL59oWHLUS6MYDqXsHk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmx1WK%2FdJMcafsHduY%2FDyHL59oWHLUS6MYDqXsHk0%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;422&quot; height=&quot;259&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림4] 최종 결과이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. insert 연산 핵심&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;insert는 항상 마지막 위치에 삽입한다.&lt;/li&gt;
&lt;li&gt;부모와 비교하면서 위로 올라간다(heapify_up)&lt;/li&gt;
&lt;li&gt;부모보다 작아지는 순간 멈춘다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. heapify_up 핵심&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자식끼리 비교하지 않는다.&lt;/li&gt;
&lt;li&gt;형제랑 비교하지 않는다.&lt;/li&gt;
&lt;li&gt;전체 탐색 하지 않는다.&lt;/li&gt;
&lt;li&gt;오직, 현재 노드와 부모 노드만 비교한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. Python으로 구현&lt;/h3&gt;
&lt;pre id=&quot;code_1776146068148&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MaxHeap:
    def __init__(self):
        self.array = [] #빈 배열 생성
        
    def heapify_up(self, k):
        while (k &amp;gt; 0) and (self.array[(k - 1 ) // 2] &amp;lt; self.array[k]):
            self.array[k], self.array[(k - 1) // 2] = self.array[(k - 1) // 2], self.array[k]
            k = (k - 1) // 2
            
    def insert(self, k):
        self.array.append(k) 
        self.heapify_up(len(self.array) - 1)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Python/자료구조</category>
      <category>heapify_up</category>
      <category>완전이진트리</category>
      <author>sik13579</author>
      <guid isPermaLink="true">https://sik13579.tistory.com/60</guid>
      <comments>https://sik13579.tistory.com/60#entry60comment</comments>
      <pubDate>Tue, 14 Apr 2026 14:55:44 +0900</pubDate>
    </item>
    <item>
      <title>트리(tree)란?</title>
      <link>https://sik13579.tistory.com/59</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.&amp;nbsp;트리(Tree)&lt;/b&gt;&lt;/h3&gt;
&lt;p 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;&quot;앞&amp;nbsp;-&amp;nbsp;뒤&quot;로&amp;nbsp;이어지는&amp;nbsp;구조였음 &lt;br /&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;HTML&amp;nbsp;DOM&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.&amp;nbsp;트리는&amp;nbsp;왜&amp;nbsp;필요할까?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학생&amp;nbsp;명단을&amp;nbsp;저장하는&amp;nbsp;건&amp;nbsp;배열로도&amp;nbsp;가능하다. &lt;br /&gt;하지만&amp;nbsp;&quot;학과장&amp;nbsp;아래&amp;nbsp;교수들,&amp;nbsp;교수&amp;nbsp;아래&amp;nbsp;조교들,&amp;nbsp;조교&amp;nbsp;아래&amp;nbsp;학생들&quot;&amp;nbsp;처럼&amp;nbsp;상하관계가&amp;nbsp;있으면&amp;nbsp;배열은&amp;nbsp;불편하다. &lt;br /&gt;연결&amp;nbsp;리스트도&amp;nbsp;한&amp;nbsp;줄로만&amp;nbsp;이어지기&amp;nbsp;때문에&amp;nbsp;&quot;누가&amp;nbsp;누구&amp;nbsp;밑에&amp;nbsp;있는가&quot;를&amp;nbsp;표현하기엔&amp;nbsp;한계가&amp;nbsp;있다. &lt;br /&gt;트리는&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.&amp;nbsp;트리의&amp;nbsp;가장&amp;nbsp;중요한&amp;nbsp;구성요소&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1775733314238&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;            A
          / | \
        B   C  D
      / \   |
     E   F  G&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A&amp;nbsp;:&amp;nbsp;루트&amp;nbsp;노드(root&amp;nbsp;node)&lt;/li&gt;
&lt;li&gt;B,&amp;nbsp;C,&amp;nbsp;D&amp;nbsp;:&amp;nbsp;A의&amp;nbsp;자식&amp;nbsp;노드(child)&lt;/li&gt;
&lt;li&gt;A&amp;nbsp;:&amp;nbsp;B,&amp;nbsp;C,&amp;nbsp;D의&amp;nbsp;부모&amp;nbsp;노드(parent)&lt;/li&gt;
&lt;li&gt;E,&amp;nbsp;F&amp;nbsp;:&amp;nbsp;B의&amp;nbsp;자식&lt;/li&gt;
&lt;li&gt;E,&amp;nbsp;F,&amp;nbsp;G,&amp;nbsp;C&amp;nbsp;:&amp;nbsp;자식이&amp;nbsp;없으면&amp;nbsp;리프&amp;nbsp;노드(leaf&amp;nbsp;node,&amp;nbsp;단말&amp;nbsp;노드) &lt;/li&gt;
&lt;/ul&gt;
&lt;p 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;기본 &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tree.png&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmKLW6/dJMcahDY07g/5Aa04jfEOUbQel1MU4h7xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmKLW6/dJMcahDY07g/5Aa04jfEOUbQel1MU4h7xK/img.png&quot; data-alt=&quot;[그림1] 트리의 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmKLW6/dJMcahDY07g/5Aa04jfEOUbQel1MU4h7xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmKLW6%2FdJMcahDY07g%2F5Aa04jfEOUbQel1MU4h7xK%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;930&quot; height=&quot;674&quot; data-filename=&quot;tree.png&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림1] 트리의 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.&amp;nbsp;핵심&amp;nbsp;용어&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;루트(root)&lt;/b&gt;&lt;br /&gt;트리의&amp;nbsp;맨&amp;nbsp;위에&amp;nbsp;있는&amp;nbsp;시작점 &lt;br /&gt;부모가 없는 유일한 노드다. 보통 트리는 하나의 루트를 가진다고 설명한다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;부모(parent)&amp;nbsp;/&amp;nbsp;자식(child)&lt;/b&gt;&lt;br /&gt;A&amp;nbsp;밑에&amp;nbsp;B가&amp;nbsp;있으면,&amp;nbsp;A는&amp;nbsp;B의&amp;nbsp;부모,&amp;nbsp;B는&amp;nbsp;A의&amp;nbsp;자식이다.&amp;nbsp;이&amp;nbsp;관계가&amp;nbsp;트리의&amp;nbsp;핵심 &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;형제(sibling)&lt;/b&gt;&lt;br /&gt;같은&amp;nbsp;부모를&amp;nbsp;가지는&amp;nbsp;노드들,&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;B,&amp;nbsp;C,&amp;nbsp;D는&amp;nbsp;형제다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;리프(leaf)&lt;/b&gt;&lt;br /&gt;자식이&amp;nbsp;하나도&amp;nbsp;없는&amp;nbsp;노드.&amp;nbsp;말단&amp;nbsp;노드라고도&amp;nbsp;불른다.&amp;nbsp;E,&amp;nbsp;F,&amp;nbsp;C,&amp;nbsp;G&amp;nbsp;같은&amp;nbsp;애들이다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서브트리(subtree)&lt;/b&gt;&lt;br /&gt;트리&amp;nbsp;안의&amp;nbsp;작은&amp;nbsp;트리라고&amp;nbsp;생각하면&amp;nbsp;된다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;B를&amp;nbsp;루트로&amp;nbsp;보고&amp;nbsp;E,&amp;nbsp;F를&amp;nbsp;포함하면&amp;nbsp;그&amp;nbsp;자체가&amp;nbsp;하나의&amp;nbsp;서브트리가&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;레벨(level)&lt;/b&gt; &lt;br /&gt;층&amp;nbsp;수&amp;nbsp;라고&amp;nbsp;생각하면&amp;nbsp;쉽다.&amp;nbsp;A가&amp;nbsp;0level,&amp;nbsp;그&amp;nbsp;아래가&amp;nbsp;한&amp;nbsp;단계씩&amp;nbsp;내려간다.&amp;nbsp;교재마다&amp;nbsp;루트를&amp;nbsp;0으로&amp;nbsp;보기도&amp;nbsp;하고&amp;nbsp;1로&amp;nbsp;보기도&amp;nbsp;해서&amp;nbsp;기준만&amp;nbsp;일관되면&amp;nbsp;된다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;높이(height)&lt;/b&gt;&lt;br /&gt;트리의&amp;nbsp;최대&amp;nbsp;깊이.&amp;nbsp;루트에서&amp;nbsp;가장&amp;nbsp;깊은&amp;nbsp;리프까지&amp;nbsp;몇&amp;nbsp;단계&amp;nbsp;내려가는지&amp;nbsp;보는&amp;nbsp;개념이다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;링크(Link,&amp;nbsp;Edge)&lt;/b&gt;&lt;br /&gt;트리를 구성하는 노드와 노드 사이를 연결하는 선(Line)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 트리의 특징&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;트리는&amp;nbsp;&quot;사이클이&amp;nbsp;없는&amp;nbsp;연결&amp;nbsp;구조다&quot; &lt;br /&gt;&lt;/b&gt;즉,&amp;nbsp;아래로&amp;nbsp;내려가다가&amp;nbsp;다시&amp;nbsp;자기&amp;nbsp;자신으로&amp;nbsp;돌아오는&amp;nbsp;고리가&amp;nbsp;없다.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;그래서&amp;nbsp;계층&amp;nbsp;구조를&amp;nbsp;표현하기&amp;nbsp;좋다.&amp;nbsp;일반적인&amp;nbsp;설명에서는&amp;nbsp;트리를&amp;nbsp;&lt;b&gt;사이클이&amp;nbsp;없는&amp;nbsp;연결&amp;nbsp;그래프&lt;/b&gt;의&amp;nbsp;한&amp;nbsp;종류로&amp;nbsp;보기도&amp;nbsp;한다.&lt;b&gt;&lt;br /&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;그리고, 보통 한 노드는&lt;b&gt; 부모를 하나&lt;/b&gt;만 가진다. &lt;br /&gt;자식은&amp;nbsp;여러&amp;nbsp;명일&amp;nbsp;수&amp;nbsp;있지만,&amp;nbsp;부모는&amp;nbsp;하나라는&amp;nbsp;게&amp;nbsp;포인트이다.&amp;nbsp;그래야&amp;nbsp;&quot;상하관계&quot;가&amp;nbsp;깔끔하게&amp;nbsp;유지된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6.&amp;nbsp;선형&amp;nbsp;구조와&amp;nbsp;비교&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배열&amp;nbsp;/&amp;nbsp;연결&amp;nbsp;리스트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;앞뒤 순서 표현에는 좋다.&lt;/li&gt;
&lt;li&gt;계층&amp;nbsp;구조&amp;nbsp;표현은&amp;nbsp;불편하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;트리&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상하&amp;nbsp;관계&amp;nbsp;표현에&amp;nbsp;강하다&lt;/li&gt;
&lt;li&gt;탐색&amp;nbsp;방향이&amp;nbsp;여러&amp;nbsp;갈래로&amp;nbsp;갈&amp;nbsp;수&amp;nbsp;있다.&lt;/li&gt;
&lt;li&gt;비선형&amp;nbsp;구조이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&amp;nbsp;배열은&amp;nbsp;&quot;줄&amp;nbsp;세우기&quot;,&amp;nbsp;트리는&amp;nbsp;&quot;조직도&amp;nbsp;만들기&quot;라고&amp;nbsp;생각하면&amp;nbsp;된다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7.예시로&amp;nbsp;이해하기&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;폴더&amp;nbsp;구조 &lt;br /&gt;C: &lt;br /&gt;│─&amp;nbsp;Users &lt;br /&gt;│&amp;nbsp;&amp;nbsp;&amp;nbsp;├─&amp;nbsp;CAT &lt;br /&gt;│&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;nbsp;Public &lt;br /&gt;└─&amp;nbsp;Program&amp;nbsp;Files &lt;br /&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;생긴다. &lt;br /&gt;실제로&amp;nbsp;트리는&amp;nbsp;디렉터리&amp;nbsp;구조를&amp;nbsp;설명할&amp;nbsp;때&amp;nbsp;대표적으로&amp;nbsp;등장한다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;조직도 &lt;br /&gt;대표&amp;nbsp;&amp;rarr;&amp;nbsp;팀장&amp;nbsp;&amp;rarr;&amp;nbsp;팀원&amp;nbsp;이것도&amp;nbsp;트리이다. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;HTML&amp;nbsp;문서&amp;nbsp;구조 &lt;br /&gt;html&amp;nbsp;아래&amp;nbsp;head,&amp;nbsp;body&amp;nbsp;그&amp;nbsp;아래&amp;nbsp;div,&amp;nbsp;p&amp;nbsp;,&amp;nbsp;span&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;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8. 마무리 정리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;트리(Tree)는&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;같은&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;일반적으로&amp;nbsp;각&amp;nbsp;노드는&amp;nbsp;하나의&amp;nbsp;부모만&amp;nbsp;가진다는&amp;nbsp;특징을&amp;nbsp;가진다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/자료구조</category>
      <category>자료구조</category>
      <category>트리</category>
      <author>sik13579</author>
      <guid isPermaLink="true">https://sik13579.tistory.com/59</guid>
      <comments>https://sik13579.tistory.com/59#entry59comment</comments>
      <pubDate>Thu, 9 Apr 2026 20:22:54 +0900</pubDate>
    </item>
    <item>
      <title>트리 - 힙 make_heap 연산</title>
      <link>https://sik13579.tistory.com/58</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.make_heap이&amp;nbsp;무엇인가?&lt;/b&gt; &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;make_heap은&amp;nbsp;힙이&amp;nbsp;아닌&amp;nbsp;배열(또는&amp;nbsp;완전이진트리&amp;nbsp;형태의&amp;nbsp;데이터)을&amp;nbsp;힙&amp;nbsp;성질을&amp;nbsp;만족하도록&amp;nbsp;바꾸는&amp;nbsp;연산이다. &lt;br /&gt;이&amp;nbsp;과정을&amp;nbsp;부모-자식&amp;nbsp;비교를&amp;nbsp;통해&amp;nbsp;재배치하는것.&amp;nbsp;보통&amp;nbsp;heapify_down을&amp;nbsp;반복해서&amp;nbsp;수행한다&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A&amp;nbsp;=&amp;nbsp;[3,&amp;nbsp;8,&amp;nbsp;2,&amp;nbsp;5,&amp;nbsp;1,&amp;nbsp;7,&amp;nbsp;6]&amp;nbsp;이런&amp;nbsp;형태의&amp;nbsp;배열이&amp;nbsp;있다고&amp;nbsp;해보자. &lt;br /&gt;이건&amp;nbsp;그냥&amp;nbsp;배열이지,&amp;nbsp;아직&amp;nbsp;힙이라는&amp;nbsp;보장은&amp;nbsp;없다.&amp;nbsp;이걸&amp;nbsp;&lt;b&gt;최대&amp;nbsp;힙&lt;/b&gt;&amp;nbsp;또는&amp;nbsp;&lt;b&gt;최소&amp;nbsp;힙&lt;/b&gt;&amp;nbsp;조건에&amp;nbsp;맞게&amp;nbsp;다시&amp;nbsp;정리하는게&amp;nbsp;&lt;b&gt;make_heap&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2.&amp;nbsp;왜&amp;nbsp;make_heap이&amp;nbsp;필요할까?&lt;/b&gt;&lt;/h3&gt;
&lt;p 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;&lt;b&gt;막&amp;nbsp;들어온&amp;nbsp;배열&lt;/b&gt;인&amp;nbsp;경우가&amp;nbsp;많다. &lt;br /&gt;그럴&amp;nbsp;때&amp;nbsp;이&amp;nbsp;전체&amp;nbsp;데이터를&amp;nbsp;&lt;b&gt;한&amp;nbsp;번에&amp;nbsp;힙&amp;nbsp;구조로&amp;nbsp;바꿔야&amp;nbsp;&lt;/b&gt;이후&amp;nbsp;find_max,&amp;nbsp;delete_max,&amp;nbsp;insert&amp;nbsp;같은&amp;nbsp;연산을&amp;nbsp;효율적으로&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.&amp;nbsp;make_heap은&amp;nbsp;위에서부터가&amp;nbsp;아니라&amp;nbsp;아래서부터&amp;nbsp;고친다.&lt;/b&gt; &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게&amp;nbsp;제일&amp;nbsp;핵심이다.&amp;nbsp;make_heap은&amp;nbsp;보통&amp;nbsp;&lt;b&gt;아래쪽&amp;nbsp;내부&amp;nbsp;노드부터&amp;nbsp;시작해서&amp;nbsp;위로&amp;nbsp;올라오면서&lt;/b&gt;&amp;nbsp;고친다. &lt;br /&gt;heapify_down을&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;br /&gt;왜&amp;nbsp;아래에서부터&amp;nbsp;해야하는가? &lt;br /&gt;부모를&amp;nbsp;고치려면&amp;nbsp;&lt;b&gt;자식&amp;nbsp;쪽이&amp;nbsp;어느&amp;nbsp;정도&amp;nbsp;정리돼&amp;nbsp;있어야&lt;/b&gt;&amp;nbsp;하기&amp;nbsp;때문이다. &lt;br /&gt;그래야&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 다른식으로 말하면 &lt;b&gt;리프(leaf)는&amp;nbsp;이미&amp;nbsp;힙이다.&lt;/b&gt; &lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;값이&amp;nbsp;8&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;br /&gt;그래서&amp;nbsp;make_heap은&amp;nbsp;이렇게&amp;nbsp;생각하면&amp;nbsp;된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;맨아래&amp;nbsp;노드들은&amp;nbsp;이미&amp;nbsp;괜찮다.&lt;/li&gt;
&lt;li&gt;그&amp;nbsp;부모를&amp;nbsp;본다.&lt;/li&gt;
&lt;li&gt;부모가&amp;nbsp;자식들과의&amp;nbsp;관계를&amp;nbsp;어기면&amp;nbsp;자리를&amp;nbsp;바꾼다. &lt;/li&gt;
&lt;li&gt;그걸&amp;nbsp;한&amp;nbsp;층씩&amp;nbsp;위로&amp;nbsp;올라가며&amp;nbsp;반복한다. &lt;/li&gt;
&lt;li&gt;마지막에&amp;nbsp;루트까지&amp;nbsp;정리되면&amp;nbsp;전체가&amp;nbsp;힙이&amp;nbsp;된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉&amp;nbsp;&lt;b&gt;&quot;작은&amp;nbsp;부분부터&amp;nbsp;힙으로&amp;nbsp;만들고,&amp;nbsp;그걸&amp;nbsp;합쳐서&amp;nbsp;전체&amp;nbsp;힙을&amp;nbsp;만든다.&quot;&lt;/b&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.&amp;nbsp;heapify_down이&amp;nbsp;뭔가?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;heapify_down은&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;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최대&amp;nbsp;힙&amp;nbsp;기준으로&amp;nbsp;설명해보자면 &lt;br /&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;것이다. &lt;br /&gt;이때는&amp;nbsp;그&amp;nbsp;부모를&amp;nbsp;아래로&amp;nbsp;내려보내야&amp;nbsp;한다. &lt;br /&gt;방법은&amp;nbsp;아래와&amp;nbsp;같다. &lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;왼쪽&amp;nbsp;자식,&amp;nbsp;오른쪽&amp;nbsp;자식&amp;nbsp;중&amp;nbsp;더&amp;nbsp;큰&amp;nbsp;자식을&amp;nbsp;찾는다.&lt;/li&gt;
&lt;li&gt;부모와&amp;nbsp;비교한다.&lt;/li&gt;
&lt;li&gt;부모가&amp;nbsp;더&amp;nbsp;작으면&amp;nbsp;더&amp;nbsp;큰&amp;nbsp;자식과&amp;nbsp;자리를&amp;nbsp;바꾼다.&lt;/li&gt;
&lt;li&gt;바꾼&amp;nbsp;뒤,&amp;nbsp;부모가&amp;nbsp;내려간&amp;nbsp;그&amp;nbsp;자리에서&amp;nbsp;다시&amp;nbsp;같은&amp;nbsp;작업을&amp;nbsp;반복한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p 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;거다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.&amp;nbsp;예제&amp;nbsp;(miro를&amp;nbsp;통해&amp;nbsp;작성해보자)&lt;/b&gt; &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열&amp;nbsp;A&amp;nbsp;=&amp;nbsp;[4,&amp;nbsp;1,&amp;nbsp;7,&amp;nbsp;3,&amp;nbsp;8,&amp;nbsp;5] &lt;br /&gt;완전이진트리로&amp;nbsp;보면&amp;nbsp;아래의&amp;nbsp;형태와&amp;nbsp;같다.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1775732967391&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;           4
         /   \
        1     7
       / \   /
      3   8 5&lt;/code&gt;&lt;/pre&gt;
&lt;p 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;한다. &lt;br /&gt;그런데&amp;nbsp;지금&amp;nbsp;보면 &lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1의&amp;nbsp;자식이&amp;nbsp;3,8이다.&lt;/li&gt;
&lt;li&gt;1은&amp;nbsp;8보다&amp;nbsp;작다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 여기서 이미 힙 조건이 깨져 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 그림으로 heapify_down 연산 이해해 보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;heapify_down 연산.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yKFPq/dJMcai3VoVC/n7oxDe6MphPfl9lReAUstK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yKFPq/dJMcai3VoVC/n7oxDe6MphPfl9lReAUstK/img.png&quot; data-alt=&quot;[그림1] heapify_down 연산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yKFPq/dJMcai3VoVC/n7oxDe6MphPfl9lReAUstK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyKFPq%2FdJMcai3VoVC%2Fn7oxDe6MphPfl9lReAUstK%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;1018&quot; height=&quot;734&quot; data-filename=&quot;heapify_down 연산.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;734&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림1] heapify_down 연산&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6.make_heap의&amp;nbsp;본질&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;make_heap은 단순히 &quot;바꾸는 기술&quot;이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사고&amp;nbsp;방식이&amp;nbsp;있는데&amp;nbsp;그것은 &lt;br /&gt;&lt;b&gt;&quot;큰&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;합쳐라.&quot;&lt;/b&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리프는&amp;nbsp;이미&amp;nbsp;힙&lt;/li&gt;
&lt;li&gt;리프의&amp;nbsp;부모를&amp;nbsp;힙으로&amp;nbsp;만듦&lt;/li&gt;
&lt;li&gt;그&amp;nbsp;위&amp;nbsp;부모를&amp;nbsp;힙으로&amp;nbsp;만듦&lt;/li&gt;
&lt;li&gt;결국&amp;nbsp;루트까지&amp;nbsp;올라가면서&amp;nbsp;전체가&amp;nbsp;힙&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런&amp;nbsp;구조이다. &lt;br /&gt;그래서&amp;nbsp;make_heap은&amp;nbsp;bottom-up&amp;nbsp;방식&amp;nbsp;이라고&amp;nbsp;부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래에서, 최대 힙을 어떻게 구현했는가 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1775733183873&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Maxheap:
    def __init__(self):
        self.array = [] 

    def heapify_down(self, k, n): 
        while 2 * k + 1 &amp;lt; n: 
            left = 2 * k + 1 
            right = 2 * k + 2 
            larger = left 

            if right &amp;lt; n and self.array[right] &amp;gt; self.array[left]:
                larger = right 

            if self.array[k] &amp;gt;= self.array[larger]: 
                break 

            self.array[k], self.array[larger] = self.array[larger], self.array[k] 
            k = larger 
    
    def make_heap(self):
        n = len(self.array)
        for k in range((n - 2) // 2, -1, -1): 
            self.heapify_down(k, n)

#최대 힙 예시
H = Maxheap()
H.array = [7, 4, 5, 3, 8, 9]
H.make_heap()
print(H.array) # [9, 8, 7, 3, 4, 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;</description>
      <category>Python/자료구조</category>
      <category>heapify_down</category>
      <category>make_heap</category>
      <author>sik13579</author>
      <guid isPermaLink="true">https://sik13579.tistory.com/58</guid>
      <comments>https://sik13579.tistory.com/58#entry58comment</comments>
      <pubDate>Thu, 9 Apr 2026 20:13:34 +0900</pubDate>
    </item>
    <item>
      <title>연결 리스트 - 환형 연결 리스트(Circular Linked List)</title>
      <link>https://sik13579.tistory.com/56</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;환형 연결 리스트의 경우에는 노드 하나가 head와 tail을 동시에 갖고 있는 구조입니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1775579062027&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Node: # 환형 연결 리스트의 노드 정의 노드가 head와 tail이 동시에 존재함 
    def __init__(self, data=None):
        self.data = data
        self.next = self
        self.prev = self&lt;/code&gt;&lt;/pre&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;환형 연결 리스트에서는 제일 중요한 파트가 splice 연산입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건은 아래와 같습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;조건 1. a -&amp;gt;... -&amp;gt; b&amp;nbsp; a와 b사이에 값이 존재해야 함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;조건 2. a와 b사이에 head 노드가 없어야 함, 마찬가지로 a와 b사이에 x노드가 있으면 안 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;a와 b사이에 있는 만큼을 cut 해서 어딘가에 위치한 노드 x 그리고 노드 xn(x.next)사이로 붙여 넣는&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Splice(a, b, x)를&amp;nbsp;하면&amp;nbsp;ap노드의&amp;nbsp;다음이&amp;nbsp;bn이된다(cut되서&amp;nbsp;a와&amp;nbsp;b노드가&amp;nbsp;나갔기 때문)&lt;br /&gt;x노드의 xn은 a노드가 되고 ... 를거쳐 b 그리고 bn은 xn이 된다 총 6개의 링크가 바뀐다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CkqQs/dJMcaipmxuc/L2FFlB2X2HukhgP1Tcfp0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CkqQs/dJMcaipmxuc/L2FFlB2X2HukhgP1Tcfp0k/img.png&quot; data-alt=&quot;ㅇSplice 연산을 그림으로 표현해 보았습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CkqQs/dJMcaipmxuc/L2FFlB2X2HukhgP1Tcfp0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCkqQs%2FdJMcaipmxuc%2FL2FFlB2X2HukhgP1Tcfp0k%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;979&quot; height=&quot;647&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;647&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ㅇSplice 연산을 그림으로 표현해 보았습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보시는 바와 같이 splice 연산은 6번의 링크가 바뀌기 때문에 O(1)으로 표기합니다.&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;다음은 , 환형 연결 리스트에서 search를 그림으로 시각화해보았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKC4Wx/dJMb990huhL/fV3JrlLxoB40G7Zg86N9p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKC4Wx/dJMb990huhL/fV3JrlLxoB40G7Zg86N9p1/img.png&quot; data-alt=&quot;환형 연결 리스트의 search 메서드 시각화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKC4Wx/dJMb990huhL/fV3JrlLxoB40G7Zg86N9p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKC4Wx%2FdJMb990huhL%2FfV3JrlLxoB40G7Zg86N9p1%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;711&quot; height=&quot;450&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;환형 연결 리스트의 search 메서드 시각화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환형 연결 리스트에서 탐색을 하는 것은 매우 비효율적입니다.&amp;nbsp;&lt;br /&gt;더미 노드 다음인 head 노드부터 시작하여 끝까지 탐색을 데이터가 n개라 했을 때 결국 시간복잡도는 O(n)이 되어 비효율적이게 됩니다. 만약, 노드가 없으면 다시 head로 돌아오고, 해당 head로 돌아오면 None을 반환합니다.&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;다음은, 환형 연결 리스트에서 remove를 그림으로 시각화해보았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM5Br5/dJMcaiv5yRb/jYL1idKJ2CX5Vys37P1b1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM5Br5/dJMcaiv5yRb/jYL1idKJ2CX5Vys37P1b1k/img.png&quot; data-alt=&quot;환형 연결 리스트 remove를 시각화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM5Br5/dJMcaiv5yRb/jYL1idKJ2CX5Vys37P1b1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM5Br5%2FdJMcaiv5yRb%2FjYL1idKJ2CX5Vys37P1b1k%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;635&quot; height=&quot;442&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;환형 연결 리스트 remove를 시각화&lt;/figcaption&gt;
&lt;/figure&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;size16&quot;&gt;환형 연결 리스트를 구현해 보았습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1775579920666&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Node: # 환형 연결 리스트의 노드 정의 노드가 head와 tail이 동시에 존재함 
    def __init__(self, data=None):
        self.data = data
        self.next = self
        self.prev = self
    
class CircularLinkedList:
    def __init__(self):
        self.head = Node()
        self.size = 0
    
    def __len__(self):
        return self.size
    
    def __str__(self):
        if len(self) == 0:
            return &quot;비어있음&quot;
        return &quot; &amp;lt;-&amp;gt; &quot;.join(str(v.data) for v in self) 

    def __iter__(self): #환형이라서 계속 돌기때문에 None처리하지말고, head로 다시 돌아오면 종료되는 구조
        v = self.head.next
        while v != self.head:
            yield v #이것이 핵심 이게 있어야 제너레이터임 여기서 yield는 값을 호출한 쪽으로 넘겨주고, 함수의 실행 상태를 저장한 채 잠시 멈춘다.
            v = v.next 

    def splice(self, a, b, x): #splice 연산 3개의 노드 a,b,x 매우 중요 ***O(1)***
        #조건 1: a -&amp;gt; ... -&amp;gt; b
        #조건 2: a와 b 사이에 head노드가 없어야함, 마찬가지로 a와 b사이에 x노드가 있으면 안된다.
        #a와 b사이에 있는 만큼을 cut해서 어딘가에 위치한 노드x 그리고 노드 xn(x.next)사이로 붙여넣는다
        #Splice(a,b,x)를 하면 ap노드의 다음이 bn이된다(cut되서 a와 b노드가 나갔기때문)
        #x노드의 xn은 a노드가 되고 ... 을거쳐 b 그리고 bn은 xn이된다 총 6개의 링크가 바뀐다.
        
        ap, bn, xn = a.prev, b.next, x.next
        
        # cut
        ap.next = bn 
        bn.prev = ap 
        
        # paste
        x.next = a 
        a.prev = x
        b.next = xn
        xn.prev = b

    def move_after(self, a, x): #노드 a를 노드 x 다음으로 이동  O(1)
        self.splice(a, a, x) #splice연산 a에서 a까지 x다음으로 
    
    def move_before(self, a, x):  # O(1)
        self.splice(a, a, x.prev)

    def insert_after(self, x, data): #O(1)
        self.move_after(Node(data), x) #data(값)을 가진 노드하나 생성하고 x 다음으로 moveafter하고, splice(a,a,x)진행
        self.size += 1

    def insert_before(self, x, data): #O(1)
        self.move_before(Node(data), x)
        self.size += 1

    def push_front(self, data): #O(1)
        self.insert_after(self.head, data) #data값을 만들어서 self.head 다음에 집어 넣어라

    def push_back(self, data): #O(1)
        self.insert_before(self.head, data)

    def search(self, data):  # O(n)
        for v in self: # __iter__() 이용하여 yield v로 하나씩 노드를 넘겨주는 for문 
            if v.data == data: # 현재 보고 있는 노드 v의 데이터 값이, 내가 찾고 싶은 data와 같은가?
                return v
        return None
        #v = self.head.next # dummy노드 다음부터 시작
        #while v != self.head: # None이 아닌 head로 돌아오면 
        #    if v.data == data:
        #        return v
        #    v = v.next
        #return None
    
    def remove(self, x): # O(1)
        if x == None or x == self.head:
            return
        x.prev.next = x.next
        x.next.prev = x.prev
        self.size -= 1

    def pop_front(self): # O(1)
        self.remove(self.head.next)

    def pop_back(self): #O(1)
        self.remove(self.head.prev)&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;환형 연결 리스트의 경우에 평균이나 최악의 경우에도 삽입과 삭제는 O(1) 상수 시간이라 매우 효율적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 접근과 탐색에 있어서는 O(n) 매우 비효율적입니다.&amp;nbsp;&lt;br /&gt;따라서 환형 연결 리스트는&amp;nbsp;&lt;b&gt;순차적인 순환 처리나 반복 구조&lt;/b&gt;와 같이 특정 위치를 빠르게 삽입/삭제해야 하는 상황에서 강점을 가지며,&amp;nbsp;&lt;b&gt;탐색보다는 구조적인 흐름 제어에 적합한 자료구조&lt;/b&gt;라고 할 수 있습니다.&lt;/p&gt;</description>
      <category>Python/자료구조</category>
      <category>자료구조</category>
      <author>sik13579</author>
      <guid isPermaLink="true">https://sik13579.tistory.com/56</guid>
      <comments>https://sik13579.tistory.com/56#entry56comment</comments>
      <pubDate>Wed, 8 Apr 2026 01:42:56 +0900</pubDate>
    </item>
  </channel>
</rss>