52. 대량 경험치 일괄 지급과 레벨업 계산 (C#)
난이도 중 해설 보기 →
결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커
(A)(B) 는 주목 위치 힌트다.
결함 코드 · C#
// ============================================================================
// [코드리뷰 문제] C# — 대량 경험치 일괄 지급과 레벨업 계산
// ----------------------------------------------------------------------------
// 시나리오:
// 캐릭터가 오래 접속하지 않은 뒤 재접속하면 "오프라인 누적 보상"으로 한 번에 아주
// 많은 경험치를 지급한다(이벤트 보상·긴 퀘스트 체인 일괄 정산도 마찬가지). 이 지급은
// 단일 처리 경로에서 한 번에 계산된다(동시성 문제는 이 문제의 범위가 아니다).
// 대량 경험치는 한 번에 여러 레벨을 올릴 수 있고, 레벨업마다 스탯 포인트를 준다.
//
// 요구사항:
// - 캐릭터는 최대 레벨(MaxLevel)을 넘어 성장하지 않는다(초과분 폐기).
// - 아주 큰 경험치를 일괄 지급해도 값이 손상되지 않고, 도달 가능한 레벨까지 정확히
// 올라가며 보상도 그만큼만 지급된다.
//
// 과제: (A) (B) 지점의 동작을 설명하고 수정안을 제시하라.
// ============================================================================
public sealed class Character
{
public int Level = 1;
public int Exp;
public int StatPoints;
// 레벨 L -> 다음 레벨까지 필요한 경험치.
public int ExpToNext(int level) => 100 * level * level;
}
public sealed class GrowthService
{
public const int MaxLevel = 60;
public void GrantExp(Character c, int amount)
{
c.Exp += amount; // (A)
while (c.Exp >= c.ExpToNext(c.Level)) // (B)
{
c.Exp -= c.ExpToNext(c.Level);
c.Level++;
c.StatPoints += 5;
}
}
} 결함 코드 · C++
// ============================================================================
// [코드리뷰 문제] C++ — 대량 경험치 일괄 지급과 레벨업 계산
// ----------------------------------------------------------------------------
// 시나리오:
// 캐릭터가 오래 미접속 후 재접속하면 "오프라인 누적 보상"으로 한 번에 아주 많은
// 경험치를 지급한다(이벤트 보상·긴 퀘스트 일괄 정산도 동일). 이 지급은 단일 처리
// 경로에서 한 번에 계산된다(동시성은 이 문제 범위가 아니다). 대량 경험치는 한 번에
// 여러 레벨을 올릴 수 있고, 레벨업마다 스탯 포인트를 준다.
//
// 요구사항:
// - 캐릭터는 최대 레벨(kMaxLevel)을 넘어 성장하지 않는다(초과분 폐기).
// - 아주 큰 경험치를 일괄 지급해도 값이 손상되지 않고, 도달 가능한 레벨까지 정확히
// 올라가며 보상도 그만큼만 지급된다.
//
// 과제: (A) (B) 지점의 동작을 설명하고 수정안을 제시하라.
//
// 빌드: g++ -std=c++17 problem.cpp
// ============================================================================
struct Character {
int level = 1;
int exp = 0;
int statPoints = 0;
int expToNext(int lv) const { return 100 * lv * lv; } // int 산술
};
class GrowthService {
public:
static constexpr int kMaxLevel = 60;
void grantExp(Character& c, int amount) {
c.exp += amount; // (A)
while (c.exp >= c.expToNext(c.level)) { // (B)
c.exp -= c.expToNext(c.level);
c.level++;
c.statPoints += 5;
}
}
}; 내 리뷰 · C#
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.
내 리뷰 · C++
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.