Unreal 개발 본 캠프 55일차

HappyCircle·2026년 2월 19일

Unreal 개발

목록 보기
72/163

📘 TIL – 귤 고르기 (Greedy 구조 이해) → 몬스터 전투 시스템 안정화 및 AnimSet 구조 확립


🧠 1️⃣ 코딩테스트 – 귤 고르기 (Greedy)

📌 문제 요약

  • 다양한 크기의 귤 중 kk개를 골라야 함.
  • 귤의 종류(크기)를 최소한으로 선택하여 kk개를 채우는 것이 목표.

🎯 문제 핵심: Greedy 알고리즘

"종류를 최소화하려면, 가장 개수가 많은 크기부터 골라야 한다."

이 문제는 복잡한 조합을 찾는 것이 아니라, 빈도수 계산정렬을 이용한 탐색 문제입니다.

✅ 구조적 접근 방식

  1. 빈도 측정: unordered_map을 사용하여 각 크기별 귤의 개수를 카운트함.
  2. 데이터 추출: 맵의 Value(개수)들만 따로 벡터에 모음.
  3. 내림차순 정렬: 가장 많이 가진 종류부터 순서대로 나열.
  4. 그리디 차감: kk에서 개수를 하나씩 빼나가며, k0k \le 0이 되는 순간의 종류 개수를 반환.

🔥 핵심 코드 (C++)

#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

int solution(int k, vector<int> tangerine) {
    unordered_map<int, int> freq;
    for (int t : tangerine) freq[t]++; // 1. 빈도 측정

    vector<int> counts;
    for (auto& p : freq) counts.push_back(p.second); // 2. 개수 추출

    sort(counts.begin(), counts.end(), greater<int>()); // 3. 내림차순 정렬

    int answer = 0;
    for (int c : counts) { // 4. Greedy 선택
        k -= c;
        answer++;
        if (k <= 0) break;
    }
    return answer;
}

🧠 구조적 깨달음

잘못된 사고올바른 사고
어떤 조합이 최선일지 모든 경우를 따짐개수가 많은 것부터 넣으면 종류는 저절로 최소가 됨
귤의 '크기' 값 자체에 집중귤의 '개수(빈도)'에만 집중하여 데이터 단순화

🎮 2️⃣ 게임 개발 – 몬스터 전투 시스템 안정화

3.1 몬스터 장애물 인식 및 공격 로직 개선

📌 문제: 몬스터가 목적지(Warehouse)로 가는 길에 구조물이 가로막으면 이를 인지하고 파괴해야 함. 단순히 '가장 가까운 타겟'을 잡으면 옆 레인의 구조물을 때리는 오작동 발생.

✅ 해결: Corridor(회랑) 기반 탐색 도입

  • 현재 위치와 목적지를 잇는 가상의 선분을 긋고, 구조물이 그 선분으로부터 일정 거리(CorridorWidth) 내에 있을 때만 공격 대상으로 인지.

3.2 건축물 파괴 중복 방지 로직 추가

📌 문제: 여러 몬스터가 동시 공격 시, 동일 틱에 OnDestroyed가 중복 호출되어 점수가 뻥튀기되거나 이펙트가 여러 번 터지는 현상.

✅ 해결: 파괴 상태 플래그(bAlreadyDestroyed) 적용.

  • 상태 변화 직전 체크하여 단 1회만 로직이 수행되도록 보장. (Atomic한 상태 관리의 중요성)

3.3 CombatComponent 빌드 오류 수정

🔎 핵심 수정: 언리얼 엔진의 Delegate 시그니처 정밀 매칭.

  • const FHitResult&와 같은 참조자나 const 키워드 하나만 빠져도 바인딩 오류 발생. 엔진 내부 선언과 100% 일치하도록 수정 완료.

3.4 AnimSet 데이터 에셋 구조 확립

📌 목표: 몬스터 종류가 늘어날 때마다 코드를 고치는 것이 아니라, 데이터만 갈아 끼우는 구조 확립.

✅ AnimSet 구조 (Data Asset):

  • AttackMontage, DeathMontage 등 애니메이션 정보 통합.
  • ProjectileClass 등 전투에 필요한 액터 정보 포함.
  • 효과: 스폰 시점에 에셋만 주입하면 몬스터의 외형과 동작이 결정되는 유연한 아키텍처 완성.

🎯 3️⃣ 전체 정리

항목핵심 요약
코딩테스트귤 고르기 → 빈도 기반 Greedy 정렬로 복잡도 해소
공격 로직Corridor 기반 타겟팅으로 디펜스 게임의 전략적 이동 구현
시스템 안정화중복 파괴 방지 및 Delegate 시그니처 수정을 통한 빌드 안정화
데이터 구조AnimSet DataAsset 도입으로 유지보수 비용 최소화
profile
개발합시다!

0개의 댓글