[250123 TIL] 코드카타 에라토스테네스의 체 | 언리얼 C++ 게임 루프 설계
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 파트를 들어야하는데 이걸 듣고 있을 때가 아닌 것 같다.
다시 말해 일주일 내내 강의만 들었더니 너무 쳐지는 것 같아서
내일은 강의말고 과제를 진행해야겠다..!