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#
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.