본문 바로가기
프로그래밍/Unreal 부트캠프

TIL 2025.02.17 기록

by Rozentea 2025. 2. 17.

0. 개요


오늘은 개인적인 일 때문에 집중을 못해서 과제에대한 것 정리와 회의 진행 사항 정도만 정리하고 마무리하려고 한다.

 

1. 챌린지반 과제


1. Map & Set

<특징>

Map과 Set은 레드 블랙 트리로 만들어져있다.

Map은 키와 값이 한쌍으로 묶어서 관리한다.

 

<시간 복잡도>

키는 유일해야하고, 검색 삽입 삭제가 평균적으로 O(logN)이다.

레드 블랙 트리를 사용해 구현되어있기 때문에 이진 탐색 트리를 사용해 빅오가 저렇게 나온다.

 

<Set의 특징>

set은 중복방지에 특화되어 있다.

Set은 Value가 따로 필요없을 때 사용한다.

set은 키만 저장한다.

 

map과 unordered_map, set, unordered_set은 코딩테스트 뿐 아니라 자주 쓰이긴한다.

 

<주의사항>

map을 이용해 sort()를 해야한다면, vector로 이동해야 한다.

 

2. 이진 탐색

시행 횟수를 절반 줄여준다.

이때 스플릿 값의 정석은 딱 절반이다. 숫자 up down 게임을 생각하면 된다.

요소들은 자동으로 정렬된다.

multimap, multiset은 키가 같지만 다른 값들을 저장하고 싶을 때 사용한다.

map<int, vector<string>> 처럼 사용해도 되는데.. 이거 좀 그렇다 하신다.

(ㅋㅋㅋㅋㅋ 앞으론 mulitmap 써야겠다. 지금까지 위처럼 사용했기에 ㅋㅋㅋㅋ)

 

3. Priority Queue

<특징>

우선 순위 큐 queue라는 것은 선입선출 자료구조였다.

우선 순위 큐는 중요도에 따라서 우선 순위가 높은 데이터들이 앞쪽에 위치되어 먼저 나가는 구조이다.

내부적으로는 힙자료구조를 사용한다.

( 이때 힙은 힙메모리와는 다른 단어이다. )

가장 큰/작은 원소를 순식간에 추출해야하는 문제에 최적화되어 있다.

 

기본적으로 최대 힙 구조이기 때문에 가장 큰 원소가 먼저 나온다.

즉, 운선순위가 높다는 것은 값이 크다는 것을 의미한다.

 

최소 힙도 사용이 가능한데, greater<> 템플릿을 인자로 전달하면, 정렬을 바꿀 수 있다.

즉, 최대, 최소 힙을 만드는 기준을 바꿀 수 있다.

디폴트 인자로는 오름차순인 less<>가 인자로 전달된다.

compare comparator를 커스텀으로 정의해 사용할 수도 있다.

( 직접 compare를 구현하지 않고도, queue에서 꺼내서 음수로 바꿔서 다시 넣어 구현하는 방법도 있다.

꼼수인데, 이게 은근 코딩테스트 현장에서 쓸 수 있는 꼼수이기 때문이다. )

 

4. next_permutation & prev_permutation

순열 순열 관련 문제에서 next_permutation, prev_permutation 를 사용하면 굉장히 편리하다.

주의할 점은 원본 데이터가 정렬 상태여야 한다.

K번째 값 찾기 nth_element를 사용할 수 있다.

파티션(pivot) 기반으로 n 번째로 작은 원소를 배열의 n번째 위치로 보낸 뒤, 그 왼쪽은 n 번째보다 작은 원소들, 오른쪽은 n번째 보다 큰원소들 이런식 으로 반 정렬을 해준다.

 

나중에 퀵 소트를 배울 때, 파티셔닝하는 로직과 매우 유사하다.

즉, 다른것들은 특정 원소 기준으로 왼쪽, 오른쪽으로만 정렬된다. 때문에 특정 번째 원소를 찾을 때 편하게 사용할 수 있다.

 

5. 연속 구간 합 구하기

partial_snum : 구간 합!

partial_snum(v.begin(), v.end(), psum.begin())

psum에 부분별 합들을 넣을 것인데, psum의 시작점부터 채워 넣겠다는 것이다.

이때, 구간 합을 구해 넣어준다.

이렇게하면, v의 0번 인덱스부터 v의 N번째 까지의 누적합이 채워넣어질건데, 이 누적합을 빼주면 구간 합을 구할 수 있다.

 

6. 유니크 값 구하기

unique는 연속된 중복 원소를 제거하는데 사용하는데, 끝 위치 iterator를 반환하는 함수이다.

이 친구는 정렬이 필수인데, 연속된 중복 원소만 제거할 수 있기 때문이다. ㅠㅠ

sort(v.begin(), v.end());

auto  newEnd = unique(v.begin(), v.end());
verase(newEnd, vend());

 

7. 총합 구하기

accumulate

accumulate(v.begin(), v.end(), 0);

이때, 3번째 인자는 초기값이다.

 

accumulate(v.begin(), v.end(), 1, multiplies<int>());

을 하면 초기값을 1로 시작하는 총 곱을 구할 수 있다.

 

accumulate(v.begin(), v.end(), 0, [](int a, int b) { return a + b + 2; });

뿐만 아니라 람다 함수로 사용자 정의 계산을 할 수 있다. 총합을 구할 때 각 원소마다 2씩을 더해줘야한다고 생각하면 위처럼 할 수 있다.

 

8. 빠른 이진 탐색

lower_bound / upper_bound는 정렬된 구간에서 이진 탐색을 깔끔하게 제공해준다.

이진 탐색은 아래 사진과 같다.

위 그림 기반으로 {1, 4, 6, 9, 15, 20, 30}에서 6을 찾는다고 가정할 때,

  • 대상이 9보다 큰가? → 작다
  • 대상이 4보다 큰가? → 크다
  • 답은 6이다.

처럼 탐색하는 방법이다.

시간 복잡도는 O(long n)이다.

 

vector<int> v = {1, 2, 4, 4, 5, 7, 8};
auto lb = lower_bound(v.begin(), v.end(), 4);
auto ub = upper_bound(v.begin(), v.end(), 4);

upper_bound는 x이상의 값이 처음 나오는 위치를 찾는다.

반대로 lower_bound는 x이하의 값이 처음 나오는 위치를 찾느다.

즉, iterator 반환이다.

 

9. 원소 변환하기

transform 구간 내의 원소들을 내가 원하는 대로 변환 시켜주는 함수이다.

 

2. 회의 기록


1. 깃 크라켄 사용법 정리 밑 테스트 진행

 

<크라켄을 사용하게된 이유>

이전에 써보았을 때 브랜치가 한눈에 보이고, 브랜치 관리가 매우 용이한 Git GUI라고 판단되어 사용하게 되었다.

 

<진행한 연습들>

Marge 연습

Rebase 연습

Marge 충돌 발생시 해결 연습

Branch 관리 연습

 

2. LFS 문제 해결

프로젝트를 만들고 LFS를 이용해 에셋 관리하는 방법을 미리 연습해 보았다.

사실 저번주 금요일에 이미 팀원끼리 연습을 마쳤지만, 이번에 다시 해보니 체크아웃이 뜨지 않는 문제가 발생했었다.

 

체크인은 되는데, 체크아웃이 되지 않으면, 결국 내가 수정하던 에셋을 다른 팀원이 수정하는 상황이 발생해 에셋 충돌이 발생할 것이기 때문에 왠만하면 문제를 해결하고 넘어가고 싶었다.

(말로 이야기하고, 서로 같은 시간에 작업하기 때문에 바로바로 물어볼 수 있는 상황이지만, 최대한 안전하게 작업하고 싶었다.)

 

조원분들 중 한 분이 다음과 같은 동작원리를 주의깊게 살펴보고 이야기 해주셔서 해결 할 수 있었다.

Git 저장소에는 실제 파일이 아닌 파일의 포인터(경로 및 메타데이터)만 저장된다.
이 포인터는 .gitattributes 파일에 정의된 규칙에 따라 생성된다.

때문에 .gitattributes를 기준으로 살펴보니 이전에 우리가 사용하던 .gitattributes와 다르다는 것을 확인할 수 있었고, 적용을 해보니  체크아웃이 정상적으로 동작하는 것을 확인할 수 있었다.

 

Unable to do a checkout in the Unreal menu · ProjectBorealis UEGitPlugin · Discussion #145

Hi, I have an Unreal project set up with Git LFS 2 module connected to gitlab. The project has Git LFS enabled and I also enabled the verify locks config option. The commit and check in processes w...

github.com

또, 우리와 동일한 문제를 겪는 분을 발견했다.

 

3. 언리얼 프로젝트 만들기

버전 : 5.5.3

Git GUI Tool : Git Kraken

프로젝트 관리 : Git, LFS

폴더 구조 :

< 각자 폴더 >

  • 초기 액터 생성 및 테스트 용도
  • 같은 에셋을 수정하는 것을 한번 더 방지하는 용도로 사용

< Eclipse_Syndrome_Asset 폴더 >

  • 최종 완성된 에셋들을 모아 Maps, Material, Mesh 폴더로 구분짓기 위함.
  • 에셋 이주를 할때 반드시 Contents 폴더로만 지정이 가능해서 혹시나 이름이 겹치는 에셋이 있을까봐 이런 폴더 구조를 사용하기로 함.

4. 1 주차 클래스 설계

<다이어그램>

 

5. 일일 일정 계획 세우기

노션을 이용해 작업 계획을 세우기 시작했다.

1주차 목표는 이미 확정적으로 세워두었기 때문에 그에 맞춰서 하나하나 구현해 나가면서 계획을 계속해 세우고, 계산해보면서 일정관리를 해 나가려한다.

(한번에 1주일 일간계획을 모두 세우면 좋겠지만, 지금 당장으로썬 얼마나 걸릴지 다들 감이 안와서 우선 이번주 내로 1주차 목표까지 순탄하게 진행되는 것을 목표로 일간 계획은 최소한 하루전에 작성하면서 다시 한번 계획을 계산해보는 방향으로 잡기로 했다.)

 

3. 마무리


무슨 개인사정이 이리도 많고 자주 있는지.. 이번에는 다른게 아니라 너무 힘든일이 있었는데.. 회의에 집중해야하고, 할건 해야하니까.

최대한 빠르게 마음을 다잡고 최대한 회의를 진행했다.

( 팀장인데.. 너무 개인적인 일로 축 쳐져 있을 수 도 없거니와 이제 프로젝트를 시작했는데 처음부터 퍼질 순 없으니.. 빠르게 털고 이전처럼 달려야지 )

 

이해해주고, 옆에서 많이 도와주고 열심히 참여해준 조원분들께 진심으로 감사드린다.

 

아무튼 오늘은 점심시간 이후로 하루종일 회의를 진행했는데, 이전에 미리 준비해두었던게 도움이 많이 되었던 것 같다.

 

덕분에 오늘 깃 크라켄 사용법에 대해서 조원분들께 알려드리고, 조금이지만,  직접 사용해보면서 사용법을 익히는 시간을 갖었다.

 

이후에는 LFS 문제를 해결하고, 본격적으로 프로젝트를 만들어 약속을 다시 추가적으로 정했다.

1. 솔루션 파일에서 클래스별로 폴더를 따로 두어서 관리하기

2. 작업할 때, 콘텐츠 폴더에서 개인 폴더에서 모든 테스트를 마친 뒤 게임 폴더에 이동시켜 Mesh, Material, Blueprint 정리하기.

ㄴ> 여기서 모든 테스트라는 것은 기능적인 부분들이 1차적으로 다 구현이 되었다고 판단이 되기까지의 테스트이다.

3. 포인터는 원시포인터가 아니라 TObjectPtr<>를 사용하기

 

이정도의 약속을 정했다.

 

이후에는 1주차 작업 목록의 클래스 설계를 진행한 뒤, 이번주 개별 일정을 짠 다음에 마무리 지었다.

 

사실 좀 더 세세한것은  앞으로 작업하면서 다시 이야기해보아야겠지만, 1차적인 준비는 모두 마무리됐다.

 

때문에 내일부터는 바로 프로젝트 작업을 진행할 예정이다.

 

그래도 오늘 해야할 일에 있어서는 온전히 100% 집중했다곤 못하지만.. 90%는 집중해서 잘 마무리할 수 있었던 것 같다.

 

이제 내일부터가 제대로된 작업의 시작이니까.. 오늘 남은 마음들을 다시 잘 추스리고, 내일부터는 다시 활기차게 달려야겠다.

 

 

 

Online FlowChart & Diagrams Editor - Mermaid Live Editor

 

mermaid.live

추가적으로 다이어그램 작업을 할때 해당 사이트를 이용했는데, 너무 괜찮았어서 남겨둔다.

'프로그래밍 > Unreal 부트캠프' 카테고리의 다른 글

TIL 2025.02.19 기록  (2) 2025.02.19
TIL 2025.02.18 기록  (0) 2025.02.18
TIL 2025.02.14 기록  (0) 2025.02.14
TIL 2025.02.13 기록  (0) 2025.02.13
TIL 2025.02.12 기록  (0) 2025.02.12