언리얼 git 관리
힙(heap) 자료구조
배열 회전
언리얼 프로젝트 역시 git으로 관리할 수 있다
대용량의 경우 LFS를 사용하기
프로젝트가 있는 폴더에서 git init하여 초기화하기
아래의 사진처럼 필수 폴더/파일만 냄기고 나머지 제거
(Content/StarterContent)의 경우 용량이 아주 크므로 제거 추천

이 폴더들만 git으로 관리
다시 프로젝트파일들 복구하려면 프로젝트 우클릭 후 generate visual studio project files 클릭하여 다시 복구


삽입동작
제거동작


최대(최소)값인 root를 반환하며 제거
제거 해도 heap구조는 유지
이는 root의 key와 마지막 node의 key값을 바꾸고, 위에서 아래로 자식노드와 비교하며 heap 구조를 완성

complete or nearly complete한 이진트리구조이므로 배열로 구현 가능
편의상 배열의 0번은 비움
root node의 index는 1번
왼쪽 자식의 index는 2i
오른쪽 자식의 index는 2i + 1
부모의 index는 i / 2

처음 heap을 만드는과정은, root만 존재하는 heap에 나머지 node들을 추가하는 것처럼 만들면 된다

Priority queues
Sorting
Selection algorithms
정렬되지 않은 배열에서 k번째로 큰(작은)값 찾기.
전부를 정렬시키고 찾는것보다 효율적.
힙 구조를 만들고, (k-1)번 root삭제했을 때의 root가 k번째로 큰(작은) 값
priority_queue
make_heap
priority_queue내부적으로 힙으로 구현되어 있어, 이를 통해 사용 가능
사용이 매우 간편하고, push(), pop(), top() 같은 직관적인 메서드 제공
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main() {
// 최대힙 (기본값)
priority_queue<int> maxHeap;
// 최소힙 (greater<int> 사용)
priority_queue<int, vector<int>, greater<int>> minHeap;
// 데이터 삽입
maxHeap.push(5); // 5
maxHeap.push(2); // 5 2
maxHeap.push(8); // 5 2 8 -> 8 2 5
maxHeap.push(1); // 8 2 5 1
// 힙 구조로 8 2 5 1 로 되어있음
// 최대값부터 출력
while (!maxHeap.empty()) {
cout << maxHeap.top() << " "; // 8 5 2 1
maxHeap.pop();
}
}
기존 벡터를 힙으로 변환
벡터의 모든 원소에 직접 접근 가능하고, 힙 구조를 세밀하게 제어할 수 있음
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> v = {5, 2, 8, 1, 9, 3};
// 벡터를 최대힙으로 변환
make_heap(v.begin(), v.end()); // 9 5 8 1 2 3
// 새 원소 추가
v.push_back(10);
push_heap(v.begin(), v.end()); // 10 9 8 1 2 3 5
// 최대값 제거
pop_heap(v.begin(), v.end());
cout << "최대값: " << v.back() << endl; // 10
v.pop_back(); // 9 5 8 1 2 3
}

기존 좌표가 (Y, X)이고 배열의 크기가 N이라면 회전 후에는 ((N - 1) - X, Y)
180, 270도는 위의 과정을 2,3 번 반복해주면 됨