"종류를 최소화하려면, 가장 개수가 많은 크기부터 골라야 한다."
이 문제는 복잡한 조합을 찾는 것이 아니라, 빈도수 계산과 정렬을 이용한 탐색 문제입니다.
unordered_map을 사용하여 각 크기별 귤의 개수를 카운트함.Value(개수)들만 따로 벡터에 모음.#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;
}
| 잘못된 사고 | 올바른 사고 |
|---|---|
| 어떤 조합이 최선일지 모든 경우를 따짐 | 개수가 많은 것부터 넣으면 종류는 저절로 최소가 됨 |
| 귤의 '크기' 값 자체에 집중 | 귤의 '개수(빈도)'에만 집중하여 데이터 단순화 |
📌 문제: 몬스터가 목적지(Warehouse)로 가는 길에 구조물이 가로막으면 이를 인지하고 파괴해야 함. 단순히 '가장 가까운 타겟'을 잡으면 옆 레인의 구조물을 때리는 오작동 발생.
✅ 해결: Corridor(회랑) 기반 탐색 도입
CorridorWidth) 내에 있을 때만 공격 대상으로 인지.📌 문제: 여러 몬스터가 동시 공격 시, 동일 틱에 OnDestroyed가 중복 호출되어 점수가 뻥튀기되거나 이펙트가 여러 번 터지는 현상.
✅ 해결: 파괴 상태 플래그(bAlreadyDestroyed) 적용.
🔎 핵심 수정: 언리얼 엔진의 Delegate 시그니처 정밀 매칭.
const FHitResult&와 같은 참조자나 const 키워드 하나만 빠져도 바인딩 오류 발생. 엔진 내부 선언과 100% 일치하도록 수정 완료.📌 목표: 몬스터 종류가 늘어날 때마다 코드를 고치는 것이 아니라, 데이터만 갈아 끼우는 구조 확립.
✅ AnimSet 구조 (Data Asset):
AttackMontage, DeathMontage 등 애니메이션 정보 통합.ProjectileClass 등 전투에 필요한 액터 정보 포함.| 항목 | 핵심 요약 |
|---|---|
| 코딩테스트 | 귤 고르기 → 빈도 기반 Greedy 정렬로 복잡도 해소 |
| 공격 로직 | Corridor 기반 타겟팅으로 디펜스 게임의 전략적 이동 구현 |
| 시스템 안정화 | 중복 파괴 방지 및 Delegate 시그니처 수정을 통한 빌드 안정화 |
| 데이터 구조 | AnimSet DataAsset 도입으로 유지보수 비용 최소화 |