[멋쟁이사자처럼 부트캠프 TIL회고] Unity 게임개발 3기 19일차
목표 : 배우던 중, 헷갈리거나 모르는 개념 복습, 프로그래머스 코테 최대한 많이 풀어보기.
자료구조와 알고리즘
자료구조(Data Sturcture)
- 데이터를 효율적으로 저장하고 관리하기 위한 '방법이나 구조'
- List, Array, Stack, Queue, Tree, Graph 등이 있음
- 프로그램의 성능과 메모리 사용 효율을 개선하는데 중요한 역할
알고리즘(Algorithm)
- 문제를 해결하거나 특정 작업을 수행하기 위한 절차나 규칙의 집합
- 효율성과 정확성이 중요
- 정렬, 탐색, 최적화
유니티 c#에서 자주 쓰이는 자료구조와 알고리즘
자료구조
- 리스트(List) : 다수의 동적 오브젝트들을 동적으로 저장하고 관리하는데 이용 ( 인벤토리, 적 스폰 목록 등)
- 딕셔너리(Dictionary) : 키-값 쌍을 이용해 빠른 검색이 필요할 때 사용 ( 게임 내 설정 데이터 매핑 등)
- Queue : FIFO 방식 ( Al 행동 큐나, 이벤트 처리 // 우리가 배운 우선순위 큐를 생각해 볼 것)
- Stack : LIFO 방식 ( 뒤로 가기 기능)
- Graph : 노드 기반의 데이터 연결 구조 (길찾기 등)
- Tree : 계층 구조를 표현 할 때 사용( 씬 계층 구조, 상태 트리, UI 계층 관리,퀘스트 또는 대화 트리)
알고리즘
- 길찾기 알고리즘
- 정렬 알고리즘
- 물리 계산
- 상태 관련 알고리즘
- LOD 알고리즘
알고리즘 관련해서는 아직 배우지 않았기 때문에 자세하게 적지 않았다.
주말에 공부하고 놀 때 하나 둘 씩 영상 찾아보자.
개념 복습
배열 (Array)
배열
- 가장 기본적이고 널리 사용되는 자료구조
- 동일한 데이터 타입 요소들을 '연속된' 메모리 공간에 저장
- 인덱스를 통해 빠르게 개별 요소에 접근 가능
장점
- 빠른 요소 접근 : O(1) 시간 복잡도
- 메모리 효율성 : 연속된 메모리 할당 -> 캐시 효율성
- 간단한 구현
- 다차원 데이터 표현 : 행렬, 이미지 등에 적합
단점
- 고정된 크기 : 동적 크기 조절 불가
- 삽입/삭제 비효율성 : O(n) 시간 복잡도
- 메모리 낭비 가능성 : 선언된 크기만큼 메모리 차지
- 연고나 데이터 저장 어려움 : 다른 자료구조에 비해 복잡한 데이터 구조 표현이 어려움
https://learn.microsoft.com/ko-kr/dotnet/api/system.array?view=net-8.0
Array 클래스 (System)
배열을 만들고, 조작하고, 검색하고, 정렬하는 메서드를 제공하므로 공용 언어 런타임의 모든 배열에 대한 기본 클래스 역할을 합니다.
learn.microsoft.com
Collection
- 하나의 이름 아래 여러개의 데이터를 묶어서 관리하는 것
- 크기가 정해져 있지 않음 (배열과 다른점)
- Dictionary, List, Queue, SortedLsit, Stack, ArrayList, Hashtable 등이 있음
리스트 (List)
List
- 배열을 기반으로 구현된 자료구조
- 데이터가 연속된 메모리 공간에 저장
- 인덱스를 통해 데이터 즉시 접근 가능(O(1))
- 배열 크기의 리사이징이 필요한 경우가 있음
장점
- 데이터 접근 속도가 빠름(O(1))
- 크기가 자동으로 조절, 고정된 크기 배열보다 유연
단점
- 삽입/삭제 시 데이터 이동이 필요하여 성능이 저하될 수 있음
https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.generic.list-1?view=net-8.0
List<T> 클래스 (System.Collections.Generic)
인덱스로 액세스할 수 있는 강력한 형식의 개체 목록을 나타냅니다. 목록을 검색, 정렬 및 조작하는 메서드를 제공합니다.
learn.microsoft.com
연결 리스트 (Linked List)
Linked List
- 데이터의 요소(노드)가 다른 노드와 포인터로 연결된 구조
- 메모리 상에서 연속적이지 않은 위치에 저장 가능
종류
- 단일 연결 리스트(Singly Linked List)
- 이중 연결 리스트(Doubly Linked List)
- 원형 연결 리스트(Circular Linked List)
장점
- 동적 크기 : 필요에 따라 크기 조절 가능
- 삽입/삭제 효율성 : 포인터만 변결하면 되므로 O(1)의 시간 복잡도(앞뒤만)
- 메모리 효율 : 필요한 만큼만 메모리 사용
- 데이터 재구성 용이 : 노드의 연결만 변겅하면 재구성 가능
단점
- 임의 접근의 비효율성 : 특정 위치 접근시 O(n) 시간 복잡도
- 추가 메모리 사용 : 포인터를 저장하기 위한 메모리 필요
- 캐시 비효율 : 메모리상 연속적이지 않아 캐시 활용도가 낮음
- 역방향 탐색 어려움(단일의 경우)
실제 사용
- 웹 브라우져의 앞/뒤 탐색 기능
- 음악 플레이어 재생 목록
- 운영체제의 프로세스 관리
- 메모리 관리: 가용 메모리 블록 연결
- 다항식의 표현과 계산
- 큰 숫자의 표현과 계산( 각 자릿수를 노드로)
https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.generic.linkedlist-1?view=net-8.0
LinkedList<T> 클래스 (System.Collections.Generic)
이중으로 연결된 목록을 나타냅니다.
learn.microsoft.com
스택 (Stack)
Stack
- 간단한 LIFO(Last In First Out) 방식을 따르는 선형 자료구조
- 배열 또는 연결 리스트로 구현 가능
- 일반적으로 메모리에서 연속된 공간을 차지하며, 동적 크기 조정 가능
- 배열 기반과 연결 리스트 기반이 차이가 있다.
장점
- 간단한 구현 : 동작 원리가 단순하고 구현이 쉬움
- 효율적인 연산 : 삽입(Push)와 삭제(Pop)가 O(1) 시간 복잡도를 가짐
- 함수 호출 관리 : 함수 호출 스택 등 메모리 관리에서 활용
단점
- 크기 제한(배열 기반) : 초기 크기가 고정되어 크기를 초과하면 재 할당 필요
- 선형 데이터 : 계층적 관계를 표현하는데 부적합
- 임의 접근 불가 : 특정 요소에 접근하려면 순차적으로 접근해야 함
실제 사용
- 재귀 함수 호출 관리
- 문자열 역순 출력 : 어 이걸로 코테 입문 문제 풀었으면 엄청 쉬웠겠다.. 다시 풀어봐야지
- 괄호 검증 // 직접 해본 경우, 15일자 자료에 보면 있다
- 탐색 알고리즘 : DFS(Depth First Search)에서 스택 사용
- Undo/Redo 기능 : 게임에서의 이전/다음 상태를 저장.
https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.stack?view=net-8.0
Stack 클래스 (System.Collections)
제네릭이 아닌 개체의 간단한 LIFO(Last In First Out: 마지막에 들어간 것부터 사용) 컬렉션을 나타냅니다.
learn.microsoft.com
큐(Queue)
Queue
- 선입선출(FIFO, First In First Out) 원칙을 따르는 선형 자료구조
- 배열이나 연결 리스트로 구현 가능
- 고정 크기(배열) / 동적 크기 (링크드 리스트 키반) 두 방식으로 동작
종류
- 기본 큐(Simple Queue) : FIFO의 기본 형태
- 원형 큐(Circular Queue) : 배열 기반 큐에서 빈 공간을 줄이기 위해 끝에서 처음으로 연결
- 우선순위 큐(Priority Queue) : 데이터에 우선순위를 부여해, 높은 우선순위 데이터 먼저 처리
- 양방향 큐(Deque, Double-Ended Queue) : 삽입/삭제를 양쪽에서 모두 가능하게 한 큐
장점
- 순차적 데이터 처리
- 효율적인 데이터 흐름 관리 : 삽입과 삭제가 빠르게 수행됨 (O(1), 연결 리스트 기반 시)
- 다양한 응용 : 작업 예약, 데이터 흐름 처리, 탐색 알고리즘 등에 사용
단점
- 임의 접근 불가 : 특정 요소에 접근할 시 순차 탐색(O(n)) 필요
- 고정 크기 문제(배열 기반 큐) : 크기 초과 시 재할당
- 메모리 낭비 가능성 (원형 큐가 아닌 배열 기반 큐) : 사용되지 않는 공간이 있을 수 있음
실제 사용
- 적 스폰 시스템
- AI 행동 관리
- 이펙트 관리(풀링 시스템) //만들어 봤음
- 이벤트 처리
- 경로 찾기 (BFS) : 알고리즘에서 큐를 사용해 탐색 노드를 관리
https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.queue?view=net-8.0
Queue 클래스 (System.Collections)
개체의 선입선출(FIFO) 컬렉션을 나타냅니다.
learn.microsoft.com
힙(Heap)
Heap
- 트리 구조 : 완전 이진 트리 구조
- 최대 힙/최소 힙이 존재 ( 최대 힙 : 부모 노드 값>= 자식 노드 값 최소 힙 부모 노드 값<= 자식 노드 값 )
- 배열 혹은 리스트로 구현
장점
- 우선순위 관리 : 최대값/최솟값을 빠르게 찾고 처리 가능
- 효율성 : 삽입 및 삭제가 O(log n)으로 빠름
- 동적 크기 : 배열 기반 힙은 크기가 유동적
단점
- 임의 접근 불가 :순차 탐색이 필요
- 구조 유지 비용 : 삽입/삭제 시 힙 속성을 유지하기 위해 추가적인 연산(Heapify)가 필요
실제 사용
- 우선순위 큐 : 작업을 우선순위에 따라 정렬하여 처리. // 만들어봤음
- 이벤트 처리 시스템 : 중요한 이벤트를 먼저 처리
- 스케줄링 시스템 : 타이머 또는 작업 우선순위 관리
개념 복습은 오늘 간단하게 이정도로 하고, 남는 시간에는 프로그래머스 코테 입문 문제 정복을 위한 시간 !
내일은 몰랐던 개념들이나 헷갈렸던 개념 (LINQ, 프로퍼티 등) 을 알아보고 공부해보자.