53. 탈것 탑승/재탑승의 검사-적용 비원자 (속도 버프 중복)

난이도 하 해설 보기 →

결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커 (A)(B) 는 주목 위치 힌트다.

결함 코드 · C#
// 시나리오: MMORPG 탈것(mount) 시스템
// - 플레이어는 탈것에 "탑승"하면 이동 속도 버프(+120%)를 받고, "하차"하면 원래 속도로 돌아온다.
// - 클라이언트는 탑승/하차 요청 패킷을 보낸다. 네트워크 지연·매크로·중복 클릭으로
//   같은 플레이어의 탑승 요청이 짧은 간격에 두 번 도착할 수 있다.
// - 세션 수신 콜백은 스레드 풀에서 실행되며, 같은 플레이어의 두 패킷이 서로 다른
//   워커에서 거의 동시에 처리될 수 있다.
//
// 요구사항:
//   1) 이미 탑승 중이면 재탑승 요청은 무시(속도 버프는 정확히 1회만 적용).
//   2) 하차하면 이동 속도는 기본값으로 정확히 복원.
//
// 과제: 아래 코드에서 두 번의 탑승 요청이 거의 동시에 도착하면 이동 속도가
//       비정상적으로 커지는(혹은 하차 후에도 버프가 남는) 경우가 있다.
//       (A),(B) 지점을 근거로 원인과 수정안을 설명하라.

using System;

public sealed class MountComponent
{
    private const float BaseSpeed = 5.0f;
    private const float MountMultiplier = 1.2f;

    public bool IsMounted;
    public float MoveSpeed = BaseSpeed;

    // 탑승 요청 처리 (세션 수신 콜백에서 호출; 같은 플레이어라도 동시 진입 가능)
    public void OnMountRequest()
    {
        if (IsMounted)              // (A)
            return;

        MoveSpeed *= MountMultiplier;
        IsMounted = true;           // (B)
    }

    public void OnDismountRequest()
    {
        if (!IsMounted)
            return;

        MoveSpeed = BaseSpeed;
        IsMounted = false;
    }
}
내 리뷰 · C#
내 답안 · 자동 저장

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