1. Day47

  • C++과 Unreal Engine으로 3D 게임 개발
  • 스탠다드 클래스
  • 커리어 데이

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

  • Chapter 3 C++과 Unreal Engine으로 3D 게임 개발

3. 스탠다드 클래스

  • 배열
  • 평가 2회차

4. 커리어데이

  • 이력서 세션

5. [8번 과제] 게임 루프 및 UI 재설계하기(제출)

  • 완료 및 제출
  • 주석 및 코드 정리

6. 내일 계획 : CH3 강의 학습, 알고리즘 문제 집중

1. Day46

  • 알고리즘 코드카타
  • C++과 Unreal Engine으로 3D 게임 개발
  • 베이직 실전 클래스

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

  • Chapter 3 C++과 Unreal Engine으로 3D 게임 개발(3-5)
    • 게임 루프 설계를 통한 게임 흐름 제어하기

3. 알고리즘 코드카타

  • 2016년(초기 코드) - 추가 개선 X

    • 기준점 설정: 2016년 1월 1일 = 금요일

      • 금요일을 인덱스 0으로 하는 요일 배열 생성
    • 각 월의 일수 저장: day[1]=31, day[2]=29, ... (2016년은 윤년)

      • day[0] = 0으로 설정해 인덱스 맞춤
    • 경과 일수 계산: 1월 1일 부터 목표 날짜까지 며칠이 지났는지 계산

      • a월 이전 달의 총 일수(for문으로 day 배열을 순회하면 누적) -1
      • 위에서 나온 값에서 b일
    • 요일 변환: 경과 일수 % 7 → 금요일 기준 요일 배열에서 조회

      #include <string>
      #include <vector>
      
      using namespace std;
      
      string solution(int a, int b) {
        int sum = -1;
        vector<int> day = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        vector<string> dow = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"};
      
        for (int i = 1; i < a; i++)
        {
            sum += day[i];
        }
      
        return dow[(sum + b) % 7];
      }

4. 베이직 실전 클래스

  • UPROPERTY, UFUNCTION와 Blueprint 심화

5. [8번 과제] 게임 루프 및 UI 재설계하기(시작)

  • 게임 폴더 및 파일 구조 설계 및 코드구현 시작

      Source/
      └── YourProject/
          ├── Public/
          │   ├── Core/
          │   │   ├── SpartaGameState.h
          │   │   └── SpartaGameInstance.h
          │   │
          │   ├── Player/
          │   │   ├── SpartaCharacter.h
          │   │   └── SpartaPlayerController.h
          │   │
          │   ├── Item/
          │   │   ├── ItemInterface.h
          │   │   ├── BaseItem.h
          │   │   └── CoinItem.h
          │   │
          │   ├── Spawning/
          │   │   ├── SpawnVolume.h
          │   │   └── ItemSpawnRow.h
          │   │
          │   └── UI/
          │       ├── SpartaHUDWidget.h
          │       ├── MainMenuWidget.h
          │       └── GameOverWidget.h
          │
          └── Private/
              ├── Core/
              │   ├── SpartaGameState.cpp
              │   └── SpartaGameInstance.cpp
              │
              ├── Player/
              │   ├── SpartaCharacter.cpp
              │   └── SpartaPlayerController.cpp
              │
              ├── Item/
              │   ├── BaseItem.cpp
              │   └── CoinItem.cpp
              │
              ├── Spawning/
              │   └── SpawnVolume.cpp
              │
              └── UI/
                  ├── SpartaHUDWidget.cpp
                  ├── MainMenuWidget.cpp
                  └── GameOverWidget.cpp

6. 내일 계획 : CH3 강의 학습, 알고리즘 문제 집중, 8번과제 제출

1. Day45

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

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

  • Chapter 3 C++과 Unreal Engine으로 3D 게임 개발(3-4)
    • 캐릭터 체력 및 점수 관리 시스템 구현하기

3. 알고리즘 코드카타

  • 푸드 파이트 대회(초기 코드)

    • 처음에는 vector f 와 vector r_f를 써서 f에 각 인덱스의 음식 갯수를 더하고 f를 역순으로 r_f에 넣어서 물의 왼쪽과 오른쪽의 음식 수량을 저장

    • 각 음식의 수량 만큼 인덱스값을 answer에 to_string()을 이용해 왼쪽 f를 입력해 넣고 ‘0’을 더한다음 오른쪽 r_f를 입력할 생각이였음

    • 그러나 굳이 vector를 안만들고 음식의 갯수를 / 2로 체크하면서 answer 에 인덱스 값을 음식 갯수만큼 넣고

    • 왼쪽이 끝나면 오른쪽에 answer값을 역순으로 복사한 temp를 만들어 answer += ‘0’ + temp

      #include <string>
      #include <vector>
      #include <iostream>
      using namespace std;
      
      string solution(vector<int> food) {
        string answer = "";
      
        int l = food.size();
        for (int i = 1; i < l; i++)
        {
            int count = food[i] / 2;
            for (int j = 0; j < count; j++)
            {
                answer += to_string(i);
            }
        }
        //temp.assign()보다 생성자에서 처리하는 것이 더 깔끔함 
        string temp(answer.rbegin(), answer.rend());
        // '0' + temp는 작동하지만 char + string이기때문에 string + string으로 통일
        answer += "0" + temp;
      
        return answer;
      }
  • 푸드 파이트 대회(개선 코드)

    • answer에 값을 추가하기 위한 2중 for문은 삭제 string(count, ‘0’ + i)로 배치할 음식의갯수만큼 한번에 입력

      #include <string>
      #include <vector>
      #include <iostream>
      using namespace std;
      
      string solution(vector<int> food) {
        string answer = "";
        int l = food.size();
      
        for (int i = 1; i < l; i++)
        {
            int count = food[i] / 2;
            answer += string(count, '0' + i);
        }
      
        string temp(answer.rbegin(), answer.rend());
        answer += "0" + temp;
      
        return answer;
      }

4. 스탠다드 클래스

  • CPU 아키텍처와 게임 루프
  • CPU 성능

5. TA 클래스

  • 머티리얼 실습(PBR재질 만들기)

6. 다음주 계획 : CH3 강의 학습, 알고리즘 문제 , 8번 과제 진행

1. Day44

  • 알고리즘 코드카타
  • C++과 Unreal Engine으로 3D 게임 개발
  • 베이직 실전 클래스

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

  • Chapter 3 C++과 Unreal Engine으로 3D 게임 개발(3-3)
    • 아이템 스폰 및 레벨 데이터 관리하기

3. 알고리즘 코드카타

  • 가장 가까운 같은 글자(초기 코드) - 추가 개선 X

    • 가장 가까운 같은 글자(초기 코드) - 추가 개선 필요 X

    • map을 이용 m[s[i]]에 최근에 나온 문자의 위치(인덱스 : i) 저장

    • 처음 나온 문자라면 answer에 -1 입력

    • if (m[s[i]]) 로 값이 존제한다면 문자의 지금 위치에서 map에 저장된 최근에 나온 문자의 인덱스 값에서 빼준 값을 answer 에 입력(틀림)

      • m[s[i]] 은 값이없으면 0 을입력함 따라서 인덱스 0에 나왔던 문자가 다시 등장하면 인덱스 0을 반환해 이미 값이 존재하더라도 false 처리
    • 해결하기 위해 m.count(s[i]) 사용 값이 있다면 1 없다면 0을 반환해서 if문 처리

      #include <string>
      #include <vector>
      #include <map>
      
      using namespace std;
      
      vector<int> solution(string s) {
        vector<int> answer;
        map<char, int> m;
      
        for (int i = 0; i < s.size(); i++)
        {
            if (m.count(s[i]))
            {
                answer.emplace_back(i - m[s[i]]);
            }
            else
            {
      
                answer.emplace_back(-1);
            }
            m[s[i]] = i;
        }
        return answer;
      }

4. 베이직 실전 클래스

  • TUniquePtr 심화 Move Semantics
  • TUniquePtr 와 TUniquePtr&, TUniquePtr&& 차이
  • L-Value, R-Value 차이
  • TUniquePtr& == L-Value 원본을 직접 접근해서 씀
  • TUniquePtr&& == R-Value 소유권 가져갈 수 있는 상태로 받음(가져가면 원본 비워짐, 안가져가면 원본 유지)

5. 내일 계획 : CH3 강의 학습, 알고리즘 문제 집중

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() 함수를 사용하여 이전 인스턴스에서 새 인스턴스로 복사

1. Day41

  • 알고리즘 코드카타
  • C++과 Unreal Engine으로 3D 게임 개발
  • 베이직 실전 클래스

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

  • Chapter 3 C++과 Unreal Engine으로 3D 게임 개발(2-4)
    • State Machine 설계를 통한 캐릭터 동작 애니메이션 적용

3. 알고리즘 코드카타

  • 시저 암호(초기 코드)
    • 소문자일경우와 대문자일경우를 나눠서 z와 Z를 넘기면 26을 빼주는 방식
#include <string>
#include <vector>

using namespace std;

string solution(string s, int n) {
    for (int i = 0; i < s.size(); i++)
    {
        if (s[i] >= 'a' && s[i] <= 'z')
        {
            if (s[i] + n > 'z')
            {
                s[i] = s[i] + n - 26;
            }
            else
            {
                s[i] += n;
            }
        }
        else if (s[i] >= 'A' && s[i] <= 'Z')
        {
            if (s[i] + n > 'Z')
            {
                s[i] = s[i] + n - 26;
            }
            else
            {
                s[i] += n;
            }
        }
    }

    return s;
}
  • 시저 암호(개선 코드)
    • range - based for 문을 이용해 인덱싱없이 처리
    • 소문자일 경우와 대문자일 경우를 나눠서
      • a - ‘a’ → 0 ~ 25 인덱스로 변환 (대문자도 마찬가지)
        • n → n 칸이동
      • % 26 → 범위 초과 시 wrap
        • ‘a’ → 다시 문자로 변환
#include <string>
#include <vector>

using namespace std;

string solution(string s, int n) {
    for (auto& a : s)
    {
        if (a >= 'a' && a <= 'z')
        {
            a = (a - 'a' + n) % 26 + 'a';
        }
        else if (a >= 'A' && a <= 'Z')
        {
            a = (a - 'A' + n) % 26 + 'A';
        }
    }

    return s;
}

4. 베이직 실전 클래스

  • 언리얼C++의 스마트포인터
  • RAII

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

1. Day40

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

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

  • 6번, 7번 과제 해설 코드 복습

3. 알고리즘 코드카타

  • 최소직사각형(초기 코드)
    • sort를 이용 백터들의 원소를 [큰값, 작은값] 으로 전부 정렬한다음 큰값 중의 최대값과 작은값 중의 최대값을 곱한값을 반환
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<vector<int>> sizes) {
    int maxW = 0;
    int maxH = 0;
    for (auto& v : sizes)
    {
        sort(v.begin(), v.end(), greater<>());
        maxW = max(maxW, v[0]);
        maxH = max(maxH, v[1]);
    }

    return maxW * maxH;
}
  • 최소직사각형(개선코드)
    • sort 대신 max(maxW, max()) 로 배열안의 큰수들중 큰수를 가져오고 max(maxH, min())으로 배열안의 짧은 수중 큰 수를 가져와서 곱함
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<vector<int>> sizes) {
    int maxW = 0;
    int maxH = 0;
    for (auto& v : sizes)
    {
        maxW = max(maxW, max(v[0], v[1]));
        maxH = max(maxH, min(v[0],v[1]));
    }

    return maxW * maxH;
}

4. 스탠다드 클래스

  • 컴퓨터 구조를 알아야 하는 이유
  • 데이터의 표현 - 비트와 인코딩
  • 소스코드와 명령어

5. TA 클래스

  • 렌더링 파이프라인
  • 렌더링 파이프라인 흐름 정리
CPU (준비)
├── 메시, 텍스처, 셰이더 등 리소스 로드
├── 어떤 오브젝트를 그릴지 결정
└── GPU한테 "렌더링" 명령 (Draw Call)
        ↓
GPU (렌더링 파이프라인 실행)
├── Input Assembler (정점 데이터 조립)
├── Vertex Shader (좌표 변환) ← Local→World→View→Clip 
├── Rasterizer (삼각형 → 픽셀) ← Clipping, NDC, Screen 변환 
├── Pixel Shader (픽셀 색상 계산)
└── Output Merger (최종 출력)
        ↓
Frame Buffer → 모니터 출력

Local Space
    ↓ Model Matrix (월드 배치)
World Space  
    ↓ View Matrix (카메라 기준 정렬)
View Space
    ↓ Projection Matrix (Frustum 정의 + w에 깊이 저장)
Clip Space
    ↓ Clipping (시야 밖 잘라냄) ← GPU가 자동 처리
    ↓ w로 나누기 (원근감 적용)
NDC (-1 ~ 1)
    ↓ Viewport Transform (해상도에 맞게)
Screen Space (픽셀 좌표)
  • 최종 Defferd Rendering 흐름 정리
CPU (준비)
├── 메시, 텍스처, 셰이더 등 리소스 로드
├── 어떤 오브젝트를 그릴지 결정
└── GPU한테 "렌더링" 명령 (Draw Call)
        ↓
========================================
   Deferred 렌더링 시작
========================================
        ↓
GPU 파이프라인(렌더링 파이프라인) 1회차: Geometry Pass
├── Input Assembler (정점 데이터 조립)
├── Vertex Shader (좌표 변환) ← Local→World(Model)→View(View)→Clip(Projection)
├── Rasterizer (삼각형 → 픽셀) ← Clipping, NDC, Screen 변환
├── Pixel Shader (표면 속성 계산)
└── Output → G-Buffer에 저장 (화면 출력 X)
        ↓
G-Buffer (여러 텍스처)
├── Diffuse (기본 색)
├── Normal (법선)
├── Metallic / Roughness
├── Specular
└── Depth (깊이)
        ↓
GPU 파이프라인(렌더링 파이프라인) 2회차: Lighting Pass
├── Input Assembler (화면 전체 quad)
├── Vertex Shader (단순 좌표 전달)
├── Rasterizer (픽셀화)
├── Pixel Shader (G-Buffer 읽고 조명 계산)
└── Output → 중간 렌더 타겟에 저장
        ↓
GPU 파이프라인(렌더링 파이프라인) 3회차: Post Process
├── Input Assembler (화면 전체 quad)
├── Vertex Shader (단순 좌표 전달)
├── Rasterizer (픽셀화)
├── Pixel Shader (블룸, 색보정, SSAO 등)
└── Output Merger (최종 출력)
        ↓
Frame Buffer → 모니터 출력

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

1. Day39

  • 알고리즘 코드카타
  • C++과 Unreal Engine으로 3D 게임 개발
  • 베이직 실전 클래스

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

  • [7번 과제] Pawn 클래스로 3D 캐릭터 만들기(제출)
    • Tick 사용 false, Tick() 함수 삭제
    • 해설 세션
  • [8번 과제] 게임 루프 및 UI 재설계하기 발제
    • 과제 발제 2월 3일 까지 제출

3. 알고리즘 코드카타

  • 삼총사
    • 3중 for문으로 모든 3개 원소를 조합하는 모든 경우의 수를 체크 후 0이 되는 경우 answer++
#include <string>
#include <vector>

using namespace std;

int solution(vector<int> number) {
    int answer = 0;
    for (int i = 0; i < number.size() - 2; i++)
    {
        for (int j = i + 1; j < number.size() - 1; j++)
        {
            for (int k = j + 1; k < number.size(); k++)
            {
                if (number[i] + number[j] + number[k] == 0)
                {
                    answer++;
                }
            }
        }
    }
    return answer;
}
  • 크기가 작은 부분 문자열(초기 코드)
    • string s에 부분 문자열을 for 문으로 추가하고 s ≤ p 면 answer++
#include <string>
#include <vector>

using namespace std;

int solution(string t, string p) {
    int answer = 0;
    int l = p.size();

    for (int i = 0; i <= t.size() - l; ++i)
    {     
        string s = "";

        for (int j = i; j < i + l; ++j)
        {
            s += t[j];
        }

        if (s <= p)
            answer++;
    }
    return answer;
}
  • 크기가 작은 부분 문자열(개선 코드)
    • string s에 t의 부분 문자열을 substr로 추가하고 s ≤ p 면 answer++
#include <string>
#include <vector>

using namespace std;

int solution(string t, string p) {

    int answer = 0;
    int l = p.size();

    for (int i = 0; i <= t.size() - l; ++i)
    {
        string s = t.substr(i, l);

        if (s <= p)
            answer++;
    }
    return answer;
}

4. 베이직 실전 클래스

- 언리얼엔진, UCLASS와 게임의 구성
- [과제 - 01/28(수) 제출] AGameModeBase, UGameInstance, AGameState, APlayerState, AHUD, APlayerController 객체들을 선언하고 엔진 내부 분석해서 어떻게 활용할지 리포트 작성

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

+ Recent posts