“구조를 먼저 정리하면 구현은 단순해진다.”
핵심 관점:
n칸에 도달하는 방법은
(n-1)칸에서 1칸 이동 + (n-2)칸에서 2칸 이동
즉,
[
dp[n] = dp[n-1] + dp[n-2]
]
피보나치 구조와 동일하다.
long long solution(int n)
{
const int MOD = 1234567;
if (n <= 2) return n;
vector<long long> dp(n + 1);
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++)
{
dp[i] = (dp[i-1] + dp[i-2]) % MOD;
}
return dp[n];
}
멀리뛰기는 경우의 수 문제가 아니라
“점화식 구조 이해 문제”다.
ps[r] - ps[l] 방식으로 부분합을 O(1)에 계산set으로 중복 제거vector<int> arr2(2*n);
for (int i = 0; i < n; i++)
{
arr2[i] = arr[i];
arr2[i + n] = arr[i];
}
vector<int> ps(2*n + 1, 0);
for (int i = 0; i < 2*n; i++)
{
ps[i+1] = ps[i] + arr2[i];
}
원형을 직접 다루지 말고
선형으로 변환하라.
※ 이 시점에서는 공격 VFX는 고려하지 않음.
오직 공격 판정과 구조 안정화에 집중.
기존 사고:
"AI가 적을 때린다."
수정된 구조:
"AI는 공격을 요청하고, 실제 판정은 애니메이션 타이밍에서 발생한다."
BT (Behavior Tree): 공격 판단
CombatComponent::RequestBasicAttack(Target): 공격 요청
Montage_Play: 공격 애니메이션 재생
AnimNotify (타격 프레임): 실제 판정 발생
결과 처리
ApplyPendingBasicDamage()FirePendingRangedProjectile()bool RequestBasicAttack(AActor* Target);
수행 작업
PendingTarget 저장제외 작업
AI는 의도를 표현하고
애니메이션이 결과를 만든다.
근접 공격
원거리 공격
문제
해결
if (bQueuedApplyDamageThisTick) return;
bQueuedApplyDamageThisTick = true;
이 시점의 Projectile은:
이라는 순수 물리 로직에 집중.
Collision 전략
BlockAll 사용 ❌| 항목 | 코딩테스트 | 게임 개발 |
|---|---|---|
| 핵심 구조 | 점화식 (DP) | AnimNotify 기반 판정 |
| 최적화 | 중복 계산 제거 | 책임 분리 |
| 안정성 | 반복 DP | 중복 데미지 방지 |
| 관점 | 수열 구조 이해 | 애니메이션 타이밍 이해 |