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++
// 시나리오: MMORPG 탈것(mount) 시스템 — C++ 서버
// - 탑승 시 이동 속도 배율(+120%)을 적용, 하차 시 기본 속도로 복원.
// - 클라이언트 탑승/하차 요청은 IO 워커 스레드들이 처리하며, 같은 플레이어의
// 요청 두 개가 서로 다른 스레드에서 거의 동시에 실행될 수 있다.
//
// 요구사항:
// 1) 이미 탑승 중이면 재탑승은 무시(배율은 정확히 1회만).
// 2) 하차 시 이동 속도는 기본값으로 정확히 복원.
//
// 과제: 두 탑승 요청이 동시에 도착하면 속도가 비정상적으로 커질 수 있다.
// (A),(B) 지점을 근거로 원인·수정안을 설명하라. (컴파일 가능해야 함)
#include <cstdio>
class MountComponent {
public:
static constexpr float kBaseSpeed = 5.0f;
static constexpr float kMountMultiplier = 1.2f;
bool is_mounted_ = false;
float move_speed_ = kBaseSpeed;
void OnMountRequest() {
if (is_mounted_) // (A)
return;
move_speed_ *= kMountMultiplier;
is_mounted_ = true; // (B)
}
void OnDismountRequest() {
if (!is_mounted_)
return;
move_speed_ = kBaseSpeed;
is_mounted_ = false;
}
};
int main() {
MountComponent m;
m.OnMountRequest();
std::printf("speed=%.2f mounted=%d\n", m.move_speed_, m.is_mounted_);
return 0;
} 내 리뷰 · C#
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.
내 리뷰 · C++
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.