<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Programming | 포트폴리오</title><link>https://ansangah.github.io/tags/programming/</link><atom:link href="https://ansangah.github.io/tags/programming/index.xml" rel="self" type="application/rss+xml"/><description>Programming</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>ko</language><lastBuildDate>Mon, 15 Apr 2024 00:00:00 +0000</lastBuildDate><image><url>https://ansangah.github.io/media/sharing.png</url><title>Programming</title><link>https://ansangah.github.io/tags/programming/</link></image><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>