TIL

[250123 TIL] 코드카타 에라토스테네스의 체 | 언리얼 C++ 게임 루프 설계

yoosorang 2025. 1. 23. 19:29

1️⃣ 알고리즘 코드카타

https://school.programmers.co.kr/learn/courses/30/lessons/136798
[소수만들기]

🤖 AI 피드백

두 함수 모두 같은 반복을 하고 있으므로
하나의 반복에서 과정을 진행하는 것이 효율적

에라토스테네스의 체를 활용해서 약수 개수를 구하는 방법도 있음

    for (int i = 1; i <= number; ++i) {
        int divisorCount = 0;

        // 약수 개수 계산: √i까지만 탐색
        for (int j = 1; j * j <= i; ++j) {
            if (i % j == 0) {
                divisorCount += (j * j == i) ? 1 : 2; // 제곱수인 경우 1 추가, 아니면 2 추가
            }
        }

        // limit 초과 시 power로 대체
        answer += (divisorCount > limit) ? power : divisorCount;
    }

 

💭 회고

함수도 따로 만들고 잘 풀었다고 생각했는데 시간초과가 떠서 처음에 당황했다.
이중 for문이 문제라고 생각했고 약수의 개수를 구하는데
시간을 줄일 수 있는 방법이 뭘까 고민하다가
저번에 AI 피드백에서 약수의 대칭성에 대해 알려줬던 것이 생각나서 적용해보았다!(굳굳)

 

2️⃣  C++와 Unreal Engine으로 3D 게임 개발

🔹소프트 레퍼런스 VS 하드 레퍼런스

TSoftClassPtr<AActor>
: 소프트 레퍼런스로 클래스의 경로 기억(별도의 조치 필요)하여 Get()으로 인스턴스 생성
TSubclassOf<AActor>
: 하드 레퍼런스로 클래스가 항상 메모리에 로드
(데이터가 많아지면 전부 메모리에 로드할 수 없어 소프트 레퍼런스 권장)

 

🔹언리얼의 데미지 처리 시스템

UGameplayStatics::ApplyDamage
: 전역함수로 어디서든지 사용 가능
AActor::TakeDamage
: Actor를 상속받으면 override해서 사용

 

🔹게임 루프 설계에 사용되는 클래스

GameMode
서버만 접근 가능한 게임 규칙 관리하는 클래스
GameState
플레이어가 사용하게 될 게임 정보를 담는 클래스
GameInstance
월드(레벨)이 바뀌어도 유지되어야 할 정보

 

3️⃣ 추가공부

🔹  에라토스테네스의 체

1. 약수 개수 구하기

  • 약수의 개수를 세려면, n의 약수를 확인하는데 모든 배수 관계를 고려하면 됩니다.
  • i가 어떤 수의 약수라면, i의 배수는 모두 i를 약수로 가집니다.
  • 1부터 n까지 반복하며, 각 숫자의 배수를 체크하여 약수 개수를 누적합니다.
#include <vector>
using namespace std;

vector<int> calculateDivisors(int n) {
    vector<int> divisors(n + 1, 0); // 각 숫자의 약수 개수를 저장할 벡터

    for (int i = 1; i <= n; ++i) {
        for (int j = i; j <= n; j += i) {
            ++divisors[j]; // i는 j의 약수이므로 증가
        }
    }

    return divisors;
}

 

2. 소수 구하기

#include <vector>
using namespace std;

vector<bool> sieve(int n) {
    vector<bool> isPrime(n + 1, true); // 초기값: 모두 소수로 가정
    isPrime[0] = isPrime[1] = false;  // 0과 1은 소수가 아님

    for (int i = 2; i * i <= n; ++i) {
        if (isPrime[i]) {
            for (int j = i * i; j <= n; j += i) { // i의 배수를 모두 제거
                isPrime[j] = false;
            }
        }
    }

    return isPrime;
}

 

💭회고
뒤로 갈수록 강의가 복잡해짐을 느끼고 있다. 
아직 완강하려면 UI 파트를 들어야하는데 이걸 듣고 있을 때가 아닌 것 같다.

다시 말해 일주일 내내 강의만 들었더니 너무 쳐지는 것 같아서
내일은 강의말고 과제를 진행해야겠다..!