Belvedere is planning to upgrade its MagicNumberService. This service keeps track of the maximum
"magic number" that it has seen, and services requests as follows:
 - Receives a serialized MagicNumberServiceRequest
 - Deserializes the request
 - Performs a computationally-intensive algorithm to generate the "magic number" for that
 request
 - Updates its maximum "magic number" if the generated "magic number" is greater
 - Constructs a MagicNumberServiceResponse, setting the DidChangeMax parameter according to
 whether the maximum "magic number" was updated
 - Serializes the response
 - Sends the response on the same connection it received the request on

Currently, the MagicNumberService is single-threaded, causing a bottleneck. You must upgrade it
to take advantage of multi-threading, subject to the following constraints:
 - The SequenceNumbers of sequential received requests must increase monotonically; any received
 requests that don't follow this pattern should not be responded to.
 - Requests must be serviced (i.e., must affect the maximum magic number) in the order they
 were received.

Note that only one MagicNumberService will exist at a time. Also note that some back-end "implementation details" are provided to you. These are only included so
that intellisense works properly in the testing environment. They do not reflect how these
features would actually be implemented, and should not be modified.

using System;

namespace MagicNumberService
{
 class MagicNumberService
 {
 private long \_nextSequenceNumber = 0;
 private long \_maxMagicNumber = 0;
 private SocketWrapper \_socketWrapper;
 private SourceOfMagic \_sourceOfMagic;

 private void HandleRequest(int connectionId, byte[] bytes)
 {
 var request = MagicNumberServiceRequest.FromSerializedBytes(bytes);
 if (request.SequenceNumber < \_nextSequenceNumber)
 {
 return;
 }
 \_nextSequenceNumber = request.SequenceNumber + 1;

 long requestMagicNumber = \_sourceOfMagic.GetMagicNumberForRequest(request); // Depends only on "request"; takes ~3 seconds
 bool didMaxChange = requestMagicNumber > \_maxMagicNumber;
 var response = new MagicNumberServiceResponse(requestMagicNumber, didMaxChange);
 \_maxMagicNumber = didMaxChange ? requestMagicNumber : \_maxMagicNumber;
 \_socketWrapper.Send(connectionId, response.SerializeToBytes());

 }

 public void Run()
 {
 while (true)
 {
 int connectionId = \_socketWrapper.Receive(out byte[] bytes); // Blocks until a request is received
 HandleRequest(connectionId, bytes);
 }
 }
 
 public MagicNumberService(SocketWrapper socketWrapper, SourceOfMagic sourceOfMagic)
 {
 \_socketWrapper = socketWrapper;
 \_sourceOfMagic = sourceOfMagic;
 }
 }

 ///////////////////////////////////////////////////////////////////////////////////////////
 // =========================== DO NOT MODIFY BELOW THIS LINE =========================== //
 ///////////////////////////////////////////////////////////////////////////////////////////

 class MagicNumberServiceRequest
 {

 public long SequenceNumber { get; }
 // ... Other fields required for the GetMagicNumberForRequest() function

 public static MagicNumberServiceRequest FromSerializedBytes(byte[] bytes)
 {
 return new MagicNumberServiceRequest(bytes);
 }
 public byte[] SerializeToBytes()
 {
 return BitConverter.GetBytes(SequenceNumber);
 }
 private MagicNumberServiceRequest(byte[] bytes)
 {
 SequenceNumber = BitConverter.ToInt64(bytes);
 }
 }

 class MagicNumberServiceResponse
 {
 public long SequenceNumber { get; }
 public bool DidMaxChange { get; }

 public byte[] SerializeToBytes()
 {
 var result = new byte[sizeof(long) + sizeof(bool)];
 BitConverter.GetBytes(SequenceNumber).CopyTo(result, 0);
 BitConverter.GetBytes(DidMaxChange).CopyTo(result, sizeof(long));
 return result;
 }
 public static MagicNumberServiceResponse FromSerializedBytes(byte[] bytes)
 {
 return new MagicNumberServiceResponse(bytes);
 }

 public MagicNumberServiceResponse(long sequenceNumber, bool didMaxChange)
 {
 SequenceNumber = sequenceNumber;
 DidMaxChange = didMaxChange;
 }

 private MagicNumberServiceResponse(byte[] bytes)
 {
 SequenceNumber = BitConverter.ToInt64(bytes, 0);
 DidMaxChange = BitConverter.ToBoolean(bytes, sizeof(long));
 }
 }

 abstract class SocketWrapper
 {
 public abstract int Receive(out byte[] bytes);
 public abstract void Send(int connectionId, byte[] bytes);
 }

 abstract class SourceOfMagic
 {
 public abstract long GetMagicNumberForRequest(MagicNumberServiceRequest request);
 }

 class Program
 {
 static void Main(string[] args)
 {
 Console.WriteLine("Hello World!");
 }
 }
}
벨베데레는 매직넘버서비스를 업그레이드할 계획입니다. 이 서비스는 최대 "매직넘버"를 추적하고최대 "매직넘버"를 추적하고 다음과 같이 요청을 처리합니다: - 직렬화된 MagicNumberServiceRequest를 수신합니다. - 요청을 역직렬화합니다. - 계산 집약적인 알고리즘을 수행하여 해당 요청에 대한 "매직넘버"를 생성합니다. 요청에 대한 "매직넘버"를 생성합니다. - 생성된 "매직넘버"가 더 큰 경우 최대 "매직넘버"를 업데이트합니다. - 최대 "매직 넘버"가 최대 "매직넘버"가 업데이트되었는지 여부 - 응답을 직렬화합니다. - 요청을 받은 것과 동일한 연결로 응답을 전송합니다.현재 MagicNumberService는 단일 스레드이므로 병목 현상이 발생합니다. 멀티 스레딩을 활용하려면업그레이드해야 하며, 다음과 같은 제약 조건이 적용됩니다: - 순차적으로 수신되는 요청의 SequenceNumber는 단조롭게 증가해야 하며, 이 패턴을 따르지 않는 수신된 요청은 패턴을 따르지 않는 요청은 응답하지 않아야 합니다. - 요청은 수신된 순서대로 처리되어야 합니다(즉, 최대 매직 넘버에 영향을 미쳐야 함). 수신된 순서대로 처리해야 합니다.매직넘버서비스는 한 번에 하나만 존재한다는 점에 유의하세요. 또한 일부 백엔드 "구현 세부 정보"가 제공된다는 점에 유의하세요. 이러한 세부 정보는 인텔리전스가테스트 환경에서 인텔리전스가 제대로 작동하도록 하기 위해서만 포함됩니다. 이러한 기능이 실제로 구현되는 방식은 반영되지 않으며기능을 실제로 구현하는 방법을 반영하지 않으므로 수정해서는 안 됩니다.System;네임스페이스 MagicNumberService{ class MagicNumberService { private long \_nextSequenceNumber = 0; private long \_maxMagicNumber = 0; private SocketWrapper \_socketWrapper; private SourceOfMagic \_sourceOfMagic; private void HandleRequest(int connectionId, byte[] bytes) { var request = MagicNumberServiceRequest.FromSerializedBytes(bytes); if (request.SequenceNumber < \_nextSequenceNumber) { return; } \다음 시퀀스 번호 = 요청.시퀀스 번호 + 1; long requestMagicNumber = \_sourceOfMagic.GetMagicNumberForRequest(request); // "요청"에만 의존; ~3초 소요 bool didMaxChange = 요청 매직넘버 > \_maxMagicNumber; var response = new MagicNumberServiceResponse(requestMagicNumber, didMaxChange); \최대매직넘버 = didMaxChange ? 요청매직넘버 : \최대매직넘버 \_socketWrapper.Send(connectionId, response.SerializeToBytes()); } public void Run() { while (true) { int connectionId = \_socketWrapper.Receive(out byte[] bytes); // 요청이 수신될 때까지 블록합니다. HandleRequest(connectionId, bytes); } }  public MagicNumberService(SocketWrapper socketWrapper, SourceOfMagic sourceOfMagic) { \_socketWrapper = socketWrapper; \_sourceOfMagic = sourceOfMagic; } } /////////////////////////////////////////////////////////////////////////////////////////// // =========================== 이 줄 아래는 수정하지 마세요 =========================== // /////////////////////////////////////////////////////////////////////////////////////////// MagicNumberServiceRequest 클래스 { public long SequenceNumber { get; } // ... GetMagicNumberForRequest() 함수에 필요한 기타 필드 public static MagicNumberServiceRequest FromSerializedBytes(byte[] bytes) { return new MagicNumberServiceRequest(bytes); } public byte[] SerializeToBytes() { return BitConverter.GetBytes(SequenceNumber); } private MagicNumberServiceRequest(byte[] bytes) { SequenceNumber = BitConverter.ToInt64(바이트); } } MagicNumberServiceResponse 클래스 { public long SequenceNumber { get; } public bool DidMaxChange { get; } public byte[] SerializeToBytes() { var result = new byte[sizeof(long) + sizeof(bool)]; BitConverter.GetBytes(SequenceNumber).CopyTo(result, 0); BitConverter.GetBytes(DidMaxChange).CopyTo(result, sizeof(long)); 반환 결과; }   { return new MagicNumberServiceResponse(bytes); } public MagicNumberServiceResponse(long sequenceNumber, bool didMaxChange) { SequenceNumber = 시퀀스번호; DidMaxChange = didMaxChange; } private MagicNumberServiceResponse(byte[] 바이트) { SequenceNumber = BitConverter.ToInt64(바이트, 0); DidMaxChange = BitConverter.ToBoolean(bytes, sizeof(long)); } } 추상 클래스 SocketWrapper { public 추상 int Receive(out byte[] bytes); public 추상 void Send(int connectionId, byte[] bytes) } 추상 클래스 SourceOfMagic { public abstract long GetMagicNumberForRequest(MagicNumberServiceRequest request); } Program 클래스 { static void Main(string[] args) { Console.WriteLine("Hello World!"); } }}