1. Day43

  • 알고리즘 코드카타
  • C++과 Unreal Engine으로 3D 게임 개발
  • 스탠다드 클래스
  • TA 클래스

2. CH3 - C++과 Unreal Engine으로 3D 게임 개발(Day43)

  • Chapter 3 C++과 Unreal Engine으로 3D 게임 개발(3-2)
    • 충돌 이벤트로 획득되는 아이템 구현하기

3. 알고리즘 코드카타

  • K번째수(초기 코드)
    • range - based for문으로 commands를 순회하면서 그안에서 for문으로 array의 배열을 commands대로 잘라서 temp에 넣고 sort로 정렬한 다음 temp의 배열에서 k번째 수를 answer 배열에 추가
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> array, vector<vector<int>> commands) {
    vector<int> answer;

    for (auto& it : commands)
    {
        vector<int> temp;
        for (int i = it[0] - 1; i <= it[1] -1; i++)
        {
            temp.emplace_back(array[i]);
        }
        sort(temp.begin(), temp.end());
        answer.emplace_back(temp[it[2] - 1]);
    }
    return answer;
}
  • K번째수(추가 코드)
    • range - based for 문 하나만 commands 기준으로 순회하면서 temp 에 array를 복사해 넣고 temp를 순회하지않고 temp의 i와 j번째 구간만 정렬한다음 k번째 수를 answer에 추가
    • for문을 하나 줄일 수 있다는 장점이 있지만 기존 코드대비 for문 마다 temp에 array의 전체 배열을 복사해 넣는다는 점에서 배열이 길어진다면 효율이 좋지 못할 수있음
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> array, vector<vector<int>> commands) {
    vector<int> answer;
    vector<int> temp;

    for (auto& it : commands)
    {
        temp = array;

        sort(temp.begin() + it[0] -1, temp.begin() + it[1]);
        answer.emplace_back(temp[it[0] + it[2] - 2]);
    }
    return answer;
}
  • 두 개 뽑아서 더하기(초기 코드)
    • 이중 for 문으로 모든 더해지는 경우의수를 구한다음 answer 에 넣고 sort로 오름차순 정리
    • 정렬된 answer 를 unique로 중복 되는 원소는 뒤로 밀고 erase로 지움
      #include <string>
      #include <vector>
      #include <algorithm>
      

using namespace std;

vector solution(vector numbers) {
vector answer;

for (int i = 0; i < numbers.size() - 1; i++)
{                       
    for (int j = i + 1; j < numbers.size(); j++)
    {
        answer.emplace_back(numbers[i] + numbers[j]);
    }
}

sort(answer.begin(), answer.end());
answer.erase(unique(answer.begin(), answer.end()), answer.end());

return answer;

}

  • 두 개 뽑아서 더하기(개선 코드)
    • set이 중복과 정렬을 자동으로 처리한다는 점을 이용해 numbers의 서로 다른 인덱스끼리의 모든 합을 set에 넣고 answer.assign을 이용해 할당
    • sort, unique, erase 과정을 assign하나로 압축
#include <string>
#include <vector>
#include <algorithm>
#include <set>

using namespace std;

vector<int> solution(vector<int> numbers) {
    vector<int> answer;
    set<int> s;

    for (int i = 0; i < numbers.size() - 1; i++)
    {                       
        for (int j = i + 1; j < numbers.size(); j++)
        {
            s.emplace(numbers[i] + numbers[j]);
        }
    }

    answer.assign(s.begin(), s.end());

    return answer;
}

4. 베이직 실전 클래스

  • System 객체 활용 계획 레포트 제출

5. 프로파일러 CI/CD 특강

  • .pdb파일에 디버깅 기록이 있어서 배포때는 제외해야함
  • 디버깅 팀 및 Profilling
    • Assertion
      • check : 거짓이면 치명적으로 중단 배포 버전에선 꺼짐
      • verify : check와 기본 동작은 같으나 배포 버전에서도 작동
      • ensure : 거짓 이여도 로그/콜스택 남기고 계속 진행
    • Profiler
      • Stat : 콘솔에서 Stat 명령어(FPS, UNIT, Game, CPUStalls, GPU 등)로 사용
      • Unreal Insights Frontend : Trace 활성화로 사용
      • Profiling Macro Functions : CPU 시간 측정(stat 콘솔 용), CPU 이벤트 마커(Unreal Insights 용), 태그별 메모리 추적

6. 내일 계획 : CH3 강의 학습, 알고리즘 문제 집중, 베이직 실전 클래스 과제 제출

1. Day42

  • 알고리즘 코드카타
  • C++과 Unreal Engine으로 3D 게임 개발
  • 스탠다드 클래스
  • TA 클래스

2. CH3 - C++과 Unreal Engine으로 3D 게임 개발(Day42)

  • Chapter 3 C++과 Unreal Engine으로 3D 게임 개발(3-1)
    • 인터페이스 기반 아이템 클래스 설계하기
// 1단계: 인터페이스 (순수 가상함수로 구현)
class IItemInterface
{
    virtual void ActivateItem() = 0;
    virtual FName GetItemType() const = 0;
};

// 2단계: 부모 클래스 (인터페이스 구현)
class ABaseItem : public AActor, public IItemInterface
{
    virtual void ActivateItem() override {}  // 빈 함수
    virtual FName GetItemType() const override { return ItemType; }
};

// 3단계: 실제 아이템 (필요한 것만 오버라이드)
class AHealingItem : public ABaseItem
{
    virtual void ActivateItem() override
    {
        // 힐링 로직
        DestroyItem();
    }
    // GetItemType()은 오버라이드 안 함 → 부모꺼 사용
};

3. 알고리즘 코드카타

  • 숫자 문자열과 영단어(초기 코드) - 이게 더 빠름
    • string list[10]에 zero부터 nine까지 배열을 준비
    • range - based for문으로 s 를 순환 (str로 받아서)
    • string temp_s 빈 문자열에 s가 알파벳일 경우 하나씩 +=
    • temp_s == list를 순환해서 참이라면 string num에 인덱스값 i를 to_string()을 이용해 추가
    • str이 정수라면 isdigit(str) 바로 num += str;
    • answer = stoi(num)으로 한번에 정수입력
#include <string>
#include <vector>
#include <cctype>

using namespace std;

int solution(string s) {
    int answer = 0;
    vector<string> numbers = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    string num = "";
    string temp_s = "";

    for (auto& str : s)
    {

        if (isalpha(str))
        {
            temp_s += str;
            for (int i = 0; i <= 9; i++)
            {
                if (temp_s == list[i])
                {
                    num += to_string(i);
                    temp_s = "";
                }
            }
        }
        else if (isdigit(str))
        {
            num += str;
        }


    }
    answer = stoi(num);
    return answer;
}
  • 숫자 문자열과 영단어(새로운 라이브러리 코드)
    • 다른 사람 풀이를 보던중 regex_replace를 확인 라이브러리 활용
    • 찾아 봤을때 regex_replace(s, regex(”zero”), “0”); 는 s 문자열을 순환해서 문자열에 zero라는 단어가 있다면 “0”으로 대체 하라는 뜻
    • 하지만 느린 편이라 시간제한이 있는 문제에서는 활용하기 어려움
#include <string>
#include <vector>
#include <regex>

using namespace std;

int solution(string s) {
    int answer;
    vector<string> numbers = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

    for (int i = 0; i < numbers.size(); i++)
    {
        s = regex_replace(s, regex(numbers[i]), to_string(i));
    }
    answer = stoi(s);
    return answer;
}

4. 스탠다드 클래스

  • 코딩 테스트 준비
  • 평가 문제 풀이

5. TA 클래스

  • 색공간
  • 텍스처 활용 기초
  • 머티리얼 에디터 주요 설정
  • 파라미터 활용
  • 자주 쓰는 노드

6. 내일 계획 : CH3 강의 학습, 알고리즘 문제 집중 CS50x 2주차 진행, 베이직 실전 클래스 과제 제출

컴파일이란?

  • 고급 프로그래밍 언어로 작성된 소스 코드를 컴파일러를 통해 컴퓨터가 이해할 수 있는 저급 언어(기계어 또는 바이트 코드)로 한꺼번에 변환하는 프로세스
  • 컴파일러 : 소스 코드 전체를 스캔하여 기계어로 변환하는 프로그램
  • 과정
    1. 전처리 과정 : 주석 제거 → 헤더 파일의 내용을 소스 코드에 삽입 → 매크로 치환 및 적용
    2. 컴파일 : 컴파일러를 통해 전처리 된 소스 코드 파일을 어셈블리어 파일로 변환(여기서 언어의 문법 검사가 이루어지고 Static한 영역들의 메모리 할당 수행)
    3. 어셈블리 : 어셈블리어 파일을 오브젝트 파일로 변환 하는 과정
    4. 링킹 : 링커를 통해 오브젝트 파일들을 묶어 실행 파일로 만드는 과정 이 과정에서 오브젝트 파일들과 프로그램에서 사용하는 라이브러리 파일들을 링크하여 하나의 실행 파일을 만든다.

컴파일 언어와 인터프리터 언어

  • 컴파일 언어 : 고급 프로그래밍 언어로 작성된 소스코드를 컴파일러로 통해 컴퓨터가 이해할 수 있는 저급 언어로 한꺼번에 변환해서 사용하는 언어
    • 컴파일 단계와 실행 단계가 각각 분리되어 있으며 컴파일은 한번만 수행한 다음 실행 파일을 실행 시킴으로써 코드 실행 속도가 빠르다. 단 프로젝트의 규모가 클 경우 컴파일 시간이 오래 걸릴 수 있다는 단점이 있음
  • 인터프리터 언어 : 프로그래밍 언어의 소스 코드를 바로 실행하는 언어
    • 소스 코드를 한꺼번에 변환하지 않고 소스 코드를 한 줄씩 읽고 실행한다.
    • 컴파일하는 과정이 없기 때문에 컴파일 시간은 소요되지 않으나 실행 파일을 별도로 생성하지 않기 때문에 실행시마다 소스 코드를 한 줄씩 읽고 실행하는 과정이 반복 수행되어 실행 속도가 느리다는 단점이 있음

블루프린트의 컴파일 과정

  1. 클래스 소거
    • 같은 UBlueprintGereratedClass를 재사용 하기 위해 기존 내용을 비운다
    • CleanAndSanitizeClass() 가 프로퍼티와 함수를 휘발성 패키지의 쓰레기 클래스로 옮기고 데이터를 소거
  2. 클래스 프로퍼티 생성
    • NewVariables 배열과 컨스트럭션 스크립트 등을 순회하면서 필요한 UProperty를 모두 찾아 CreateClassVariablesFromBlueprint() 로 생성한다.
  3. 함수 목록 생성
    • 이벤트 그래프 처리
    • 함수 그래프 처리
    • 함수 미리 컴파일
  4. 클래스 바인딩과 링크
    • UProperty, UFunction이 확정되면 프로퍼티 체인, 프로퍼티 크기, 함수 맵을 채우며 이 시점에서 클래스 헤더와 CDO(Class Default Object)가 생김
  5. 함수 컴파일
    • 노드 핸들러의 Compile() 함수가 AppendStatementForNode()로 FKismetCompiledStatement 객체 생성
  6. 클래스 컴파일 완료
    • 클래스 플래그 마무리, 부모 클래스에서 플래그와 메타데이터 전파, 최종 검증
  7. 백엔드, 생성된 코드 방출
    • 백엔드는 각각의 함수 컨텍스트에서의 구문 모음을 코드로 변환
      • FKismetCompilerVMBackend : FKCS 를 UnrealScript VM 바이트코드로 변환, 이후 함수의 스크립트 배열로 시리얼라이즈
      • FKismetCppBackend : 순수 디버깅 용도의 C++같은 코드를 방출
  8. 클래스 디폴트 오브젝트 프로퍼티 복사
    • 컴파일러는 특수 함수 CopyPropertiesForUnrelatedObjects() 를 사용하여 이전 클래스의 클래스 디폴트 오브젝트(CDO) 값을 새 CDO 로 복사
    • 프로퍼티는 태깅된 시리얼라이제이션을 통해 복사되므로 이름이 일관되기만 하다면 제대로 전송될 것
    • CDO 의 컴포넌트는 이 단계에서 다시 인스턴싱되고 적절히 수정됨
    • GeneratedClass CDO 는 authoritative
  9. 다시 인스턴싱
    • 클래스 크기나 프로퍼티가 변경됐을 수 있으니 TObjectIterator로 기존 인스턴스를 찾고 새 것을 스폰
    • CopyPropertiesForUnrelatedObjects() 함수를 사용하여 이전 인스턴스에서 새 인스턴스로 복사

+ Recent posts