<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DataStructure | 포트폴리오</title><link>https://ansangah.github.io/tags/datastructure/</link><atom:link href="https://ansangah.github.io/tags/datastructure/index.xml" rel="self" type="application/rss+xml"/><description>DataStructure</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>ko</language><lastBuildDate>Thu, 10 Oct 2024 00:00:00 +0000</lastBuildDate><image><url>https://ansangah.github.io/media/sharing.png</url><title>DataStructure</title><link>https://ansangah.github.io/tags/datastructure/</link></image><item><title>알고리즘</title><link>https://ansangah.github.io/blog/subjects/algorithm/</link><pubDate>Thu, 10 Oct 2024 00:00:00 +0000</pubDate><guid>https://ansangah.github.io/blog/subjects/algorithm/</guid><description>&lt;h2 id="1-개요"&gt;1. 개요&lt;/h2&gt;
&lt;p&gt;알고리즘 과목은 데이터를 구조화하고 문제를 효율적으로 해결하기 위한 방법론을 학습한다. 아래 정리는 강의에서 다루는 대표 주제를 빠르게 복습하거나, 각 개념의 관계를 한눈에 파악하기 위해 구성되었다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-정렬-알고리즘"&gt;2. 정렬 알고리즘&lt;/h2&gt;
&lt;p&gt;정렬은 대부분의 문제 해결 과정에서 선행되어야 하는 기본 연산이다. 알고리즘 선택 시 입력 크기, 데이터 분포, 메모리 사용량, 안정성(안정 정렬 여부) 등을 고려한다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;알고리즘&lt;/th&gt;
&lt;th&gt;평균 시간복잡도&lt;/th&gt;
&lt;th&gt;최악 시간복잡도&lt;/th&gt;
&lt;th&gt;추가 공간&lt;/th&gt;
&lt;th&gt;특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;병합 정렬 (Merge Sort)&lt;/td&gt;
&lt;td&gt;O(n log n)&lt;/td&gt;
&lt;td&gt;O(n log n)&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;td&gt;안정 정렬, 외부 정렬에 적합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;퀵 정렬 (Quick Sort)&lt;/td&gt;
&lt;td&gt;O(n log n)&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;td&gt;O(log n)&lt;/td&gt;
&lt;td&gt;분할 정복, 피벗 선택이 핵심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;선택 정렬 (Selection Sort)&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;교환 횟수가 적음, 불안정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;버블 정렬 (Bubble Sort)&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;구현이 단순, 이미 정렬된 경우 빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;삽입 정렬 (Insertion Sort)&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;td&gt;O(n²)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;부분적으로 정렬된 데이터에 효율적, 안정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;기수 정렬 (Radix Sort)&lt;/td&gt;
&lt;td&gt;O(d·n)&lt;/td&gt;
&lt;td&gt;O(d·n)&lt;/td&gt;
&lt;td&gt;O(n+k)&lt;/td&gt;
&lt;td&gt;자릿수 기반, 비교 연산 불필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;계수·버킷 정렬 (Counting/Bucket)&lt;/td&gt;
&lt;td&gt;O(n+k)&lt;/td&gt;
&lt;td&gt;O(n+k)&lt;/td&gt;
&lt;td&gt;O(n+k)&lt;/td&gt;
&lt;td&gt;데이터 범위가 작거나 균등 분포일 때 강력&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="21-병합-정렬"&gt;2.1 병합 정렬&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;분할 정복 패턴을 통해 배열을 절반씩 나누고, 정렬된 부분 배열을 병합한다.&lt;/li&gt;
&lt;li&gt;안정 정렬이므로 동일 키의 상대적 순서가 유지된다.&lt;/li&gt;
&lt;li&gt;단점: 추가 메모리 요구, 재귀 호출로 인한 오버헤드.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-퀵-정렬"&gt;2.2 퀵 정렬&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;피벗을 기준으로 작은 값과 큰 값으로 파티셔닝 후 재귀 정렬.&lt;/li&gt;
&lt;li&gt;평균적으로 가장 빠르지만, 이미 정렬된 데이터에서 최악의 O(n²)가 발생하므로 랜덤 피벗 선택, median-of-three 등의 기법을 활용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="23-선택-정렬"&gt;2.3 선택 정렬&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;남아 있는 원소 중 최솟값(또는 최댓값)을 찾아 앞으로 보낸다.&lt;/li&gt;
&lt;li&gt;교환 횟수가 O(n)으로 제한되지만 전반적으로 느려 교육용으로 주로 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24-버블-정렬"&gt;2.4 버블 정렬&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;인접한 두 원소를 비교하여 순서가 틀리면 교환한다.&lt;/li&gt;
&lt;li&gt;패스마다 가장 큰 값이 뒤로 이동한다. 버전마다 조기 종료 플래그를 사용하면 부분 정렬된 데이터를 빠르게 처리 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="25-삽입-정렬"&gt;2.5 삽입 정렬&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;현재 원소를 이미 정렬된 구간에 삽입한다.&lt;/li&gt;
&lt;li&gt;리스트 길이가 작거나 사실상 정렬된 상태라면 매우 효율적이며, 각 단계에서 안정성이 유지된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="26-기수-정렬"&gt;2.6 기수 정렬&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;정수나 고정 길이 문자열을 자릿수별로 정렬한다. LSD(Least Significant Digit) 방식은 낮은 자릿수부터, MSD(Most Significant Digit)는 높은 자릿수부터 처리한다.&lt;/li&gt;
&lt;li&gt;내부적으로 안정 정렬(예: 계수 정렬)을 사용해야 전체 정렬의 안정성이 유지된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="27-계수-정렬과-버킷-정렬"&gt;2.7 계수 정렬과 버킷 정렬&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;계수 정렬은 값의 범위 k가 작을 때 O(n+k)의 성능을 보장하고, 버킷 정렬은 입력이 균등 분포일 때 평균 O(n) 성능을 기대한다.&lt;/li&gt;
&lt;li&gt;메모리 사용량이 크며, 실제 값의 범위를 사전에 알아야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="3-트리-레드-블랙-트리"&gt;3. 트리: 레드-블랙 트리&lt;/h2&gt;
&lt;p&gt;Balanced Binary Search Tree의 대표 구현 중 하나로, 삽입·삭제 후에도 높이가 O(log n)으로 유지되도록 색상 규칙을 적용한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;불변 조건&lt;/strong&gt;: (1) 각 노드는 빨강 또는 검정, (2) 루트·리프(NIL)는 검정, (3) 빨강 노드의 자식은 모두 검정, (4) 어떤 노드에서 리프까지 가는 모든 경로의 검정 노드 수 동일.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;연산&lt;/strong&gt;: 삽입은 이진 탐색 트리에 삽입 후 색 재조정과 회전을 수행한다. 삭제는 대체 노드 선택 후 &lt;code&gt;double black&lt;/code&gt; 문제를 해결하기 위해 추가 회전/재색.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;장점&lt;/strong&gt;: AVL 트리보다 회전 횟수가 적어 삽입/삭제가 빈번한 환경에서 유리.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;응용&lt;/strong&gt;: STL의 &lt;code&gt;std::map&lt;/code&gt;, &lt;code&gt;std::set&lt;/code&gt;, Java의 &lt;code&gt;TreeMap&lt;/code&gt;, Linux Completely Fair Scheduler 등.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="4-해시-테이블"&gt;4. 해시 테이블&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;개념&lt;/strong&gt;: 키를 해시 함수로 변환하여 배열 인덱스를 직접 접근함으로써 평균 O(1)의 탐색/삽입/삭제 성능을 목표로 하는 자료구조.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;충돌(Collision)&lt;/strong&gt;: 다른 키가 같은 해시 버킷을 점유하는 현상. 해시 함수 품질과 로드 팩터(load factor = n / m)가 성능을 좌우한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="41-충돌-해결-전략"&gt;4.1 충돌 해결 전략&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;체이닝(Separate Chaining)&lt;/strong&gt;: 같은 버킷에서 연결 리스트/동적 배열을 사용. 구현이 단순하며 확장이 유연하지만 추가 포인터 메모리가 필요.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;개방 주소법(Open Addressing)&lt;/strong&gt;: 빈 버킷을 탐색해 데이터를 저장. 선형 조사(linear probing), 제곱 조사(quadratic probing), 이중 해싱(double hashing) 등이 있다. 캐시 친화적이지만 클러스터링 문제가 발생할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;재해싱(Rehashing)&lt;/strong&gt;: 로드 팩터가 임계치를 넘으면 테이블 크기를 확장하고 모든 요소를 다시 해시한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="42-설계-팁"&gt;4.2 설계 팁&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;좋은 해시 함수는 균등 분포, 계산 효율성, 의도적 공격에 대한 저항성을 갖춰야 한다.&lt;/li&gt;
&lt;li&gt;동시성 환경에서는 락프리 해시, 세그먼트 락 등 추가 고려가 필요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="5-그래프-알고리즘"&gt;5. 그래프 알고리즘&lt;/h2&gt;
&lt;p&gt;그래프는 정점과 간선으로 구성된 추상화로, 네트워크, 경로 탐색, 위상 관계를 모델링한다. 구현 시 인접 리스트가 공간 효율적이며, 밀집 그래프는 인접 행렬이 연산을 단순화한다.&lt;/p&gt;
&lt;h3 id="51-위상-정렬-topological-sort"&gt;5.1 위상 정렬 (Topological Sort)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;방향 비순환 그래프(DAG)의 선행 관계를 선형 순서로 나열한다.&lt;/li&gt;
&lt;li&gt;Kahn 알고리즘(진입 차수 0 큐)과 DFS 기반 알고리즘이 대표적. 순환이 존재하면 수행이 불가능하므로 검출 역할도 수행한다.&lt;/li&gt;
&lt;li&gt;과목 선후수 관계, 빌드 시스템, 작업 스케줄링에 활용.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="52-벨만-포드-알고리즘-bellman-ford"&gt;5.2 벨만-포드 알고리즘 (Bellman-Ford)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;음수 가중치가 존재하는 그래프에서 단일 출발점 최단 경로를 구한다.&lt;/li&gt;
&lt;li&gt;총 V-1회 간선 완화(relaxation)를 수행하며, V번째 완화에서 값이 갱신되면 음수 사이클이 존재함을 의미한다.&lt;/li&gt;
&lt;li&gt;Dijkstra가 적용되지 않는 네트워크 라우팅(RIP) 등에 필수.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="53-페블-게임-pebble-game"&gt;5.3 페블 게임 (Pebble Game)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DAG상의 노드에 조약돌(pebble)을 배치하면서 계산 순서를 분석하는 모델.&lt;/li&gt;
&lt;li&gt;레지스터 할당, 메모리 최소화 문제, 증명 복잡도 등에서 필요한 자원 수의 하한을 유도할 때 사용한다.&lt;/li&gt;
&lt;li&gt;목표는 목표 노드에 pebble을 올리기 위해 필요한 최소 pebble 수 또는 이동 횟수를 찾는 것. 동적 계획법, 탐욕 전략으로 표현 가능하지만 일반 그래프에서는 난이도가 높다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="54-기타-그래프-알고리즘-개요"&gt;5.4 기타 그래프 알고리즘 개요&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DFS/BFS&lt;/strong&gt;: 탐색 기본기. 경로 유무, 컴포넌트, 위상 정렬의 토대.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strongly Connected Components (SCC)&lt;/strong&gt;: Kosaraju, Tarjan 알고리즘으로 DAG 축약 그래프 파악.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;최소 신장 트리(MST)&lt;/strong&gt;: Kruskal, Prim 알고리즘. 네트워크 비용 최소화 문제의 기본.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="6-문자열-매칭-라빈-카프-rabin-karp"&gt;6. 문자열 매칭: 라빈-카프 (Rabin-Karp)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;롤링 해시를 이용해 패턴의 해시값과 텍스트 부분 문자열 해시값을 비교한다.&lt;/li&gt;
&lt;li&gt;O(n+m) 기대시간을 제공하며, 해시 충돌 발생 시 실제 문자열 비교로 검증한다.&lt;/li&gt;
&lt;li&gt;여러 패턴을 동시에 검색할 때 패턴 해시를 미리 계산해두면 효율적이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="7-학습-팁"&gt;7. 학습 팁&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;구현 연습 시 시간복잡도 분석과 함께 최악·평균 케이스 데이터를 직접 만들어 시험해 본다.&lt;/li&gt;
&lt;li&gt;시각화 도구(VisuAlgo, CS Academy 등)로 단계별 동작을 확인하면 개념 이해가 빠르다.&lt;/li&gt;
&lt;li&gt;실제 코딩 테스트에서는 공간 제한과 입력 범위를 먼저 파악해 적절한 알고리즘을 선택한다.&lt;/li&gt;
&lt;li&gt;참고 교재: CLRS, Algorithms (Sedgewick), Problem Solving with Algorithms and Data Structures (Miller &amp;amp; Ranum).&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>자료구조</title><link>https://ansangah.github.io/blog/subjects/ds/</link><pubDate>Mon, 15 Apr 2024 00:00:00 +0000</pubDate><guid>https://ansangah.github.io/blog/subjects/ds/</guid><description>&lt;h2 id="1-개요"&gt;1. 개요&lt;/h2&gt;
&lt;p&gt;자료구조는 데이터를 메모리와 디스크에 조직화하여 알고리즘이 효율적으로 작동하도록 돕는 기반 기술이다. 문제 해결 시에는 추상 자료형(ADT)이 제공하는 연산과 실제 구현 기법의 장단점을 함께 고려해야 한다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-배열과-클래스"&gt;2. 배열과 클래스&lt;/h2&gt;
&lt;h3 id="21-배열array"&gt;2.1 배열(Array)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;특징&lt;/strong&gt;: 연속된 메모리 블록, 인덱스를 통한 O(1) 랜덤 접근.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;제약&lt;/strong&gt;: 크기 고정, 중간 삽입·삭제 시 평균 O(n)의 이동 비용.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;활용&lt;/strong&gt;: 캐시 효율이 높아 수치 계산, DP 테이블, 게임 루프 상태 관리 등에 적합.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-클래스-래핑"&gt;2.2 클래스 래핑&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;배열을 래핑한 클래스는 &lt;strong&gt;경계 검사&lt;/strong&gt;, &lt;strong&gt;동적 크기 조정&lt;/strong&gt;, &lt;strong&gt;반복자 제공&lt;/strong&gt; 같은 안정 장치를 제공한다.&lt;/li&gt;
&lt;li&gt;C++ &lt;code&gt;std::vector&lt;/code&gt;, Java &lt;code&gt;ArrayList&lt;/code&gt;는 내부적으로 동적 배열을 사용하며, 용량이 가득 차면 2배 확장(Amortized O(1) push).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="3-스택과-큐"&gt;3. 스택과 큐&lt;/h2&gt;
&lt;h3 id="31-스택stack"&gt;3.1 스택(Stack)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;후입선출(LIFO) 구조. 함수 호출 스택, 괄호 검사, DFS 역추적에 활용.&lt;/li&gt;
&lt;li&gt;핵심 연산: &lt;code&gt;push&lt;/code&gt;, &lt;code&gt;pop&lt;/code&gt;, &lt;code&gt;top&lt;/code&gt;. 배열·연결 리스트로 구현 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="32-큐queue"&gt;3.2 큐(Queue)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;선입선출(FIFO) 구조. BFS, 작업 스케줄링, 스트림 버퍼에서 사용.&lt;/li&gt;
&lt;li&gt;핵심 연산: &lt;code&gt;enqueue&lt;/code&gt;, &lt;code&gt;dequeue&lt;/code&gt;, &lt;code&gt;front&lt;/code&gt;. 원형 배열을 쓰면 인덱스가 자동으로 순환한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="33-덱deque"&gt;3.3 덱(Deque)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;양쪽에서 삽입·삭제 가능. 슬라이딩 윈도우, 모노톤 큐 최적화에 자주 등장.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="4-포인터와-연결-리스트"&gt;4. 포인터와 연결 리스트&lt;/h2&gt;
&lt;h3 id="41-포인터"&gt;4.1 포인터&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;포인터는 메모리 주소를 보관하는 변수. 동적 메모리(&lt;code&gt;malloc&lt;/code&gt;, &lt;code&gt;new&lt;/code&gt;)로 생성한 객체를 가리킨다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;주의&lt;/strong&gt;: 널 포인터 방지, Dangling Pointer(해제 후 사용), 이중 해제를 경계해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="42-단일-연결-리스트singly-linked-list"&gt;4.2 단일 연결 리스트(Singly Linked List)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;노드: &lt;code&gt;(데이터, 다음 포인터)&lt;/code&gt;. 삽입·삭제가 O(1), 임의 접근은 O(n).&lt;/li&gt;
&lt;li&gt;머리 삽입, 꼬리 포인터 유지, 더미 헤드 사용으로 구현 복잡도를 낮춘다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="43-이중-연결-리스트doubly-linked-list"&gt;4.3 이중 연결 리스트(Doubly Linked List)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;앞·뒤 포인터를 모두 보유하여 양방향 순회 가능. LRU 캐시, 에디터 구현에 유용.&lt;/li&gt;
&lt;li&gt;포인터 업데이트가 두 배로 많아 실수 발생 여지가 있으므로 테스트가 필수.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="5-리스트-추상-자료형"&gt;5. 리스트 추상 자료형&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;리스트 ADT는 순서를 가진 요소 컬렉션을 정의하며, 구현체에 따라 성능이 달라진다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;동적 배열 리스트&lt;/strong&gt;: 인덱스 접근 O(1), 중간 삽입·삭제 O(n).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;연결 리스트&lt;/strong&gt;: 삽입·삭제 O(1) (포인터 확보 시), 검색 O(n). Iteration이 잦다면 커서 기반 인터페이스를 활용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="6-재귀recursion"&gt;6. 재귀(Recursion)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;함수가 자기 자신을 호출해 문제를 하위 문제로 쪼갠다.&lt;/li&gt;
&lt;li&gt;구성 요소: &lt;strong&gt;기저 사례(Base Case)&lt;/strong&gt;, &lt;strong&gt;재귀 관계&lt;/strong&gt;, &lt;strong&gt;상태 전파&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;시스템 호출 스택 깊이 제한을 고려해야 하며, Tail Recursion은 반복문으로 변환해 최적화 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="7-트리tree"&gt;7. 트리(Tree)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;비선형 계층 자료구조. 루트에서 자식으로 분기하며 사이클이 없다.&lt;/li&gt;
&lt;li&gt;용어 정리: 깊이(depth), 높이(height), 차수(degree), 서브트리(subtree).&lt;/li&gt;
&lt;li&gt;순회: 전위(preorder), 중위(inorder), 후위(postorder), 레벨 순서(level-order). 재귀 또는 큐를 활용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="8-이진-탐색-트리bst"&gt;8. 이진 탐색 트리(BST)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;왼쪽 서브트리 &amp;lt; 루트 &amp;lt; 오른쪽 서브트리 규칙을 유지하는 이진 트리.&lt;/li&gt;
&lt;li&gt;평균적으로 탐색·삽입·삭제 O(log n), 편향 시 O(n).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;균형화 기법&lt;/strong&gt;: AVL, Red-Black Tree, Treap, Splay Tree 등. 균형 트리를 사용하면 최악 시간 복잡도를 보장할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="9-우선순위-큐priority-queue"&gt;9. 우선순위 큐(Priority Queue)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;각 요소에 우선순위를 부여하고 가장 높은(또는 낮은) 우선순위 요소를 반환.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;힙(Heap)&lt;/strong&gt; 기반 구현이 일반적: &lt;code&gt;insert&lt;/code&gt;, &lt;code&gt;extract&lt;/code&gt; O(log n), &lt;code&gt;peek&lt;/code&gt; O(1).&lt;/li&gt;
&lt;li&gt;Applications: Dijkstra, 작업 스케줄링, 이벤트 시뮬레이션, Median 유지.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="10-그래프graph"&gt;10. 그래프(Graph)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;정점(V)과 간선(E)으로 구성. 방향성, 다중 간선, 자기 루프 유무로 분류.&lt;/li&gt;
&lt;li&gt;표현 방식:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;인접 리스트&lt;/strong&gt;: 희소 그래프에 적합, 공간 O(V+E).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;인접 행렬&lt;/strong&gt;: 간선 여부 확인 O(1), 공간 O(V²).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;탐색 기법: DFS(스택/재귀), BFS(큐). 컴포넌트 분리, 위상 정렬, 사이클 검출 등 다양한 문제의 기본.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="11-가중치-그래프weighted-graph"&gt;11. 가중치 그래프(Weighted Graph)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;간선마다 비용이 있는 그래프. 지도, 네트워크, 물류 최적화 등에서 활용.&lt;/li&gt;
&lt;li&gt;단일 출발 최단 거리: Dijkstra(음수 가중치X), Bellman-Ford(음수 허용), SPFA(평균 개선).&lt;/li&gt;
&lt;li&gt;전체 최단 거리: Floyd-Warshall(O(V³)), Johnson 알고리즘(희소 그래프에 효율적).&lt;/li&gt;
&lt;li&gt;최소 신장 트리: Kruskal(Union-Find), Prim(우선순위 큐).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="12-정렬sorting"&gt;12. 정렬(Sorting)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;데이터 순서를 재구성해 탐색이나 통계를 용이하게 하는 기본 연산.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비교 기반&lt;/strong&gt;: 퀵·병합·힙 정렬, 하한 O(n log n).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비교 비기반&lt;/strong&gt;: 계수, 기수, 버킷 정렬. 데이터 범위나 자릿수를 활용해 O(n+k) 달성.&lt;/li&gt;
&lt;li&gt;조건 비교: 안정성, 제자리(in-place), 메모리, 분할 정복 여부 등을 평가해 선택한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="13-탐색searching"&gt;13. 탐색(Searching)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;선형 탐색&lt;/strong&gt;: 순차 검사, 정렬 불필요, O(n).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이진 탐색&lt;/strong&gt;: 정렬된 배열에서 중간값 비교로 범위를 절반씩 축소, O(log n).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;해시 탐색&lt;/strong&gt;: 평균 O(1), 충돌 대비 체이닝/개방 주소법을 설계.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;트리 탐색&lt;/strong&gt;: BST, B-Tree 등에서 노드 비교로 O(log n) 기대. 균형 유지가 핵심.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="14-학습-팁"&gt;14. 학습 팁&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;각 자료구조 연산의 시간·공간 복잡도를 직접 표로 정리해 반복 암기한다.&lt;/li&gt;
&lt;li&gt;IDE 디버거로 포인터 변화를 추적하면 연결 구조와 재귀 호출 흐름이 명확해진다.&lt;/li&gt;
&lt;li&gt;실전 문제에서는 입력 크기, 갱신 빈도, 임의 접근 필요성 등을 분석해 최적의 자료구조를 선택하라.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>