πŸ—’ COMPUTER SCIENCE

자료ꡬ쑰(Data Structure) 총정리

chamroro 2025. 2. 24. 19:33

λŒ€ν‘œμ  자료ꡬ쑰 및 μ•Œκ³ λ¦¬μ¦˜ 정리

μ΅œκ·Όμ— 자료ꡬ쑰 λΆ„λ₯˜ 도식, λ°°μ—΄(array), μ—°κ²° 리슀트(linked list), μŠ€νƒ(stack), μž¬κ·€ν•¨μˆ˜μ™€ μŠ€νƒ λ©”λͺ¨λ¦¬, 큐(queue), λ©€ν‹°μŠ€λ ˆλ”©κ³Ό 큐에 λŒ€ν•΄ λ‹€μ‹œ κ³΅λΆ€ν–ˆλ‹€. 이 외에도 ν•΄μ‹œν…Œμ΄λΈ”, κ·Έλž˜ν”„, 트리, νž™ λ“± μ€‘μš”ν•œ 자료ꡬ쑰λ₯Ό 포함해 μ€‘μš” 자료ꡬ쑰 8개λ₯Ό μ •λ¦¬ν•΄λ³΄λ €ν•œλ‹€. 


0. 자료ꡬ쑰 λΆ„λ₯˜ 도식

μžλ£Œκ΅¬μ‘°λŠ” 크게 μ„ ν˜•(Linear) μžλ£Œκ΅¬μ‘°μ™€ λΉ„μ„ ν˜•(Non-linear) 자료ꡬ쑰둜 λΆ„λ₯˜λœλ‹€

  • μ„ ν˜• 자료ꡬ쑰:
    λ°°μ—΄, μ—°κ²° 리슀트, μŠ€νƒ, 큐 등이 λŒ€ν‘œμ 
    • νŠΉμ§•: λ©”λͺ¨λ¦¬ 상에 연속적 λ˜λŠ” 순차적으둜 데이터λ₯Ό μ €μž₯ν•˜λ©°, μ‚½μž…/μ‚­μ œ 연산이 ν•œμͺ½ 끝 λ˜λŠ” μ€‘κ°„μ—μ„œ 이루어짐
  • λΉ„μ„ ν˜• 자료ꡬ쑰:
    트리, νž™, κ·Έλž˜ν”„ 등이 있으며, 계측적 λ˜λŠ” λ„€νŠΈμ›Œν¬ ν˜•νƒœλ‘œ 데이터λ₯Ό μ €μž₯
    • νŠΉμ§•: λ…Έλ“œλ“€ κ°„μ˜ 관계가 계측적(트리, νž™) λ˜λŠ” μž„μ˜(κ·Έλž˜ν”„)둜 μ—°κ²°λ˜μ–΄ μžˆμ–΄ λ³΅μž‘ν•œ 데이터 관계λ₯Ό ν‘œν˜„ν•  수 있음

λ˜ν•œ ν•΄μ‹œν…Œμ΄λΈ”μ€ ν‚€-κ°’ μŒμ„ 기반으둜 ν•˜λŠ” 자료ꡬ쑰둜, 일반적으둜 λΉ λ₯Έ 검색과 μ‚½μž…μ„ μœ„ν•΄ μ‚¬μš©λ¨


1. λ°°μ—΄ (Array)

  • μ •μ˜:
    λ™μΌν•œ νƒ€μž…μ˜ 데이터λ₯Ό μ—°μ†λœ λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯ν•˜λŠ” 자료ꡬ쑰
  • νŠΉμ§•:
    • μž₯점:
      • 인덱슀λ₯Ό ν†΅ν•œ **O(1)**의 λΉ λ₯Έ μ ‘κ·Ό 속도
      • λ©”λͺ¨λ¦¬ 할당이 λ‹¨μˆœν•¨
    • 단점:
      • 크기가 κ³ μ •λ˜μ–΄ μžˆμ–΄ 동적 크기 쑰절이 μ–΄λ ΅κ±°λ‚˜, λ³„λ„μ˜ 동적 λ°°μ—΄ κ΅¬ν˜„μ΄ ν•„μš”ν•¨
      • μ‚½μž…/μ‚­μ œ μ‹œ 전체 μš”μ†Œμ˜ 이동이 ν•„μš”ν•  수 있음
  • ν™œμš©:
    기본적인 데이터 μ €μž₯, μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ˜ 기초 자료ꡬ쑰 λ“±

2. μ—°κ²° 리슀트 (Linked List)

  • μ •μ˜:
    각 λ…Έλ“œκ°€ 데이터와 λ‹€μŒ λ…Έλ“œμ— λŒ€ν•œ 포인터(μ°Έμ‘°)λ₯Ό κ°€μ§€λ©°, λ…Έλ“œλ“€μ΄ μ—°κ²°λœ ν˜•νƒœμ˜ 자료ꡬ쑰
  • νŠΉμ§•:
    • μž₯점:
      • 동적 λ©”λͺ¨λ¦¬ ν• λ‹ΉμœΌλ‘œ 크기 쑰절이 μžμœ λ‘œμ›€
      • μ‚½μž…/μ‚­μ œκ°€ 빠름 (특히 리슀트 μ€‘κ°„μ—μ„œ) – 포인터 μ‘°μž‘λ§ŒμœΌλ‘œ κ°€λŠ₯
    • 단점:
      • μž„μ˜ 접근이 μ–΄λ ΅κ³ , 순차 μ ‘κ·Ό(O(n))이 ν•„μš”ν•¨
      • 각 λ…Έλ“œμ— 좔가적인 포인터 μ €μž₯ 곡간 ν•„μš”
  • ν™œμš©:
    μŠ€νƒ, 큐의 λ‚΄λΆ€ κ΅¬ν˜„, 데이터 μ €μž₯ μ‹œ λΉˆλ²ˆν•œ μ‚½μž…/μ‚­μ œ μž‘μ—… λ“±

3. μŠ€νƒ (Stack)

  • μ •μ˜:
    ν›„μž…μ„ μΆœ(LIFO, Last In First Out) 원칙을 λ”°λ₯΄λŠ” μ„ ν˜• 자료ꡬ쑰
  • μ£Όμš” μ—°μ‚°:
    • Push: μŠ€νƒμ˜ top에 μš”μ†Œ μ‚½μž…
    • Pop: μŠ€νƒμ˜ topμ—μ„œ μš”μ†Œ μ‚­μ œ
  • ν™œμš©:
    • ν•¨μˆ˜ 호좜 μ‹œ μ‚¬μš©ν•˜λŠ” 콜 μŠ€νƒ
    • undo/redo κΈ°λŠ₯, κ΄„ν˜Έ 검사, 깊이 μš°μ„  탐색(DFS) λ“±

πŸ“ μž¬κ·€ν•¨μˆ˜μ™€ μŠ€νƒ λ©”λͺ¨λ¦¬

  • μž¬κ·€ ν•¨μˆ˜:
    자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λ‘œ, 문제λ₯Ό 더 μž‘μ€ ν•˜μœ„ 문제둜 λ‚˜λˆ μ„œ 해결함
  • μŠ€νƒ λ©”λͺ¨λ¦¬μ™€μ˜ 관계:
    • 각 μž¬κ·€ 호좜 μ‹œ ν•¨μˆ˜μ˜ μƒνƒœ(λ§€κ°œλ³€μˆ˜, μ§€μ—­ λ³€μˆ˜, λ°˜ν™˜ μ£Όμ†Œ λ“±)κ°€ μŠ€νƒ ν”„λ ˆμž„μœΌλ‘œ μŠ€νƒμ— μ €μž₯λ©λ‹ˆλ‹€.
    • **μ’…λ£Œ 쑰건(Base Case)**에 λ„λ‹¬ν•˜λ©΄ 호좜이 μ’…λ£Œλ˜κ³ , μŠ€νƒ ν”„λ ˆμž„μ΄ ν•˜λ‚˜μ”© popλ˜μ–΄ κ²°κ³Όκ°€ μ°¨λ‘€λ‘œ λ°˜ν™˜λ©λ‹ˆλ‹€.
    • μž¬κ·€ κΉŠμ΄κ°€ λ„ˆλ¬΄ 깊으면 μŠ€νƒ μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•  수 있음
  • 예제:
    νŒ©ν† λ¦¬μ–Ό, ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄ 등이 λŒ€ν‘œμ μΈ μž¬κ·€ μ•Œκ³ λ¦¬μ¦˜

4. 큐 (Queue)

  • μ •μ˜:
    μ„ μž…μ„ μΆœ(FIFO, First In First Out) 원칙을 λ”°λ₯΄λŠ” μ„ ν˜• 자료ꡬ쑰
  • μ£Όμš” μ—°μ‚°:
    • Enqueue: 큐의 rear(λ’€μͺ½)에 μš”μ†Œ μ‚½μž…
    • Dequeue: 큐의 front(μ•žμͺ½)μ—μ„œ μš”μ†Œ μ‚­μ œ
  • ν™œμš©:
    • μž‘μ—… λŒ€κΈ°μ—΄, 이벀트 처리, λ„ˆλΉ„ μš°μ„  탐색(BFS) λ“±
    • Python의 경우 queue.Queue λ˜λŠ” collections.dequeλ₯Ό μ‚¬μš©ν•΄ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ λ©€ν‹°μŠ€λ ˆλ”©κ³Ό 큐

  • λ©€ν‹°μŠ€λ ˆλ”©:
    ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— μ‹€ν–‰λ˜μ–΄ 병렬 μ²˜λ¦¬λ‚˜ λ™μ‹œμ— μ—¬λŸ¬ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 있게 함
  • νμ™€μ˜ κ²°ν•©:
    • μƒμ‚°μž-μ†ŒλΉ„μž νŒ¨ν„΄:
      • μƒμ‚°μž μŠ€λ ˆλ“œ: μž‘μ—…(데이터, μš”μ²­)을 큐에 μΆ”κ°€
      • μ†ŒλΉ„μž μŠ€λ ˆλ“œ: νμ—μ„œ μž‘μ—…μ„ κΊΌλ‚΄μ–΄ 처리
    • μŠ€λ ˆλ“œ μ•ˆμ „ 큐:
      • λ©€ν‹°μŠ€λ ˆλ”© ν™˜κ²½μ—μ„œλŠ” 동기화가 ν•„μš”ν•œλ°, μŠ€λ ˆλ“œ μ•ˆμ „ν•œ 큐(예: Java의 ConcurrentLinkedQueue, Python의 queue.Queue)λ₯Ό μ‚¬μš©ν•΄ λ°μ΄ν„°μ˜ 일관성을 보μž₯
  • 예제 μ½”λ“œ:
    • Pythonμ—μ„œλŠ” threading λͺ¨λ“ˆκ³Ό queue.Queueλ₯Ό ν™œμš©
    • Javaμ—μ„œλŠ” ExecutorService와 μŠ€λ ˆλ“œ μ•ˆμ „ 큐λ₯Ό ν™œμš©ν•˜μ—¬ κ΅¬ν˜„

5. ν•΄μ‹œν…Œμ΄λΈ” (Hash Table)

  • μ •μ˜:
    ν•΄μ‹œν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€ν™˜ν•œ 값을 색인(index)으둜 μ‚Όμ•„ ν‚€(key)와 데이터(value)λ₯Ό μ €μž₯ν•˜λŠ” 자료ꡬ쑰
  • νŠΉμ§•:
    • 평균 O(1)의 검색, μ‚½μž…, μ‚­μ œ 속도λ₯Ό 보μž₯
    • ν•΄μ‹œ 좩돌(Collision) ν•΄κ²° 기법: 체이닝, μ˜€ν”ˆ μ–΄λ“œλ ˆμ‹± λ“±
  • ν™œμš©:
    λ°μ΄ν„°λ² μ΄μŠ€ 인덱슀, μΊμ‹œ, λ”•μ…”λ„ˆλ¦¬ κ΅¬ν˜„ λ“±

6. κ·Έλž˜ν”„ (Graph)

  • μ •μ˜:
    λ…Έλ“œ(정점)와 κ°„μ„ (μ—°κ²°)으둜 κ΅¬μ„±λœ λΉ„μ„ ν˜• 자료ꡬ쑰
  • μœ ν˜•:
    • 무방ν–₯ κ·Έλž˜ν”„: 간선이 λ°©ν–₯성을 κ°–μ§€ μ•ŠμŒ
    • 유방ν–₯ κ·Έλž˜ν”„: 간선에 λ°©ν–₯성이 있음
    • κ°€μ€‘μΉ˜ κ·Έλž˜ν”„: 간선에 κ°€μ€‘μΉ˜(λΉ„μš©)κ°€ 있음
  • ν™œμš©:
    • μ†Œμ…œ λ„€νŠΈμ›Œν¬, 지도(μ΅œλ‹¨ 경둜), μ›Ή 크둀링 λ“±
    • 탐색 μ•Œκ³ λ¦¬μ¦˜: λ„ˆλΉ„ μš°μ„  탐색(BFS), 깊이 μš°μ„  탐색(DFS)

7. 트리 (Tree)

  • μ •μ˜:
    계측적 ꡬ쑰λ₯Ό κ°€μ§„ λΉ„μ„ ν˜• 자료ꡬ쑰둜, ν•˜λ‚˜μ˜ 루트 λ…Έλ“œμ™€ μ—¬λŸ¬ μžμ‹ λ…Έλ“œλ“€λ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.
  • μ’…λ₯˜:
    • 이진 트리(Binary Tree) 및 이진 탐색 트리(BST)
    • AVL 트리, λ ˆλ“œ-λΈ”λž™ 트리 λ“± κ· ν˜• 작힌 트리
  • ν™œμš©:
    • 파일 μ‹œμŠ€ν…œ, λ°μ΄ν„°λ² μ΄μŠ€ 인덱슀, νŒŒμ‹±, κ²Œμž„ AI λ“±
    • 트리 순회 방법: μ „μœ„(preorder), μ€‘μœ„(inorder), ν›„μœ„(postorder)

8. νž™ (Heap)

  • μ •μ˜:
    μ™„μ „ 이진 트리 ν˜•νƒœμ˜ 자료ꡬ쑰둜, 각 λΆ€λͺ¨ λ…Έλ“œκ°€ μžμ‹ λ…Έλ“œλ³΄λ‹€ μš°μ„ μˆœμœ„κ°€ λ†’λ‹€λŠ” νŠΉμ„±μ„ κ°€μ§‘λ‹ˆλ‹€.
    • μ΅œλŒ€ νž™(Max Heap): λΆ€λͺ¨ λ…Έλ“œκ°€ μžμ‹ λ…Έλ“œλ³΄λ‹€ ν¬κ±°λ‚˜ κ°™μŒ
    • μ΅œμ†Œ νž™(Min Heap): λΆ€λͺ¨ λ…Έλ“œκ°€ μžμ‹ λ…Έλ“œλ³΄λ‹€ μž‘κ±°λ‚˜ κ°™μŒ
  • νŠΉμ§• 및 ν™œμš©:
    • μš°μ„ μˆœμœ„ 큐: νž™μ„ μ‚¬μš©ν•˜μ—¬ μš°μ„ μˆœμœ„ 기반 μž‘μ—… 처리λ₯Ό 효율적으둜 μˆ˜ν–‰
    • νž™ μ •λ ¬(Heapsort): μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ˜ ν•œ 방법

 

λ°˜μ‘ν˜•