2025-03-17TIL 트러블슈팅

별빛에소원을·2025년 3월 17일

TeamSparta-Unreal1기-TIL

목록 보기
58/90
post-thumbnail

알고리즘 : 연속수열의합

배열길이

해당 문제는 원형 수열의 구간의 합의 배열의 원소를 리턴하는 문제다
처음에 배열 elements배열에 7,9,1,1,4가 주어지는데 길이가 4가 주어진다면 맨끝에서 4,7,9,1 을 처리할 수 없기 때문에 배열의 길이를 2배로 늘려서 처리한다.

이 방법의 장점은 해당 배열의 길이만큼 들어오더라도 표현할 수 있기 때문에 배열의 길이만큼 원형을 처리한다고 하더라도 처리가 가능해진다.

누적합 배열

누적합 배열은 2n+1로 구성한다. 이 배열이 필요한 이유는 구간합을 편하게 계산하기 위해서다.
해당 배열은 다음과 같이 구성된다.

PrefixSum[00] = 0;
PrefixSum[01] = 0 + 7;
PrefixSum[02] = 0 + 7 + 9;
PrefixSum[03] = 0 + 7 + 9 + 1;
PrefixSum[04] = 0 + 7 + 9 + 1 + 1;
PrefixSum[05] = 0 + 7 + 9 + 1 + 1 + 4;
PrefixSum[06] = 0 + 7 + 9 + 1 + 1 + 4 + 7;
PrefixSum[07] = 0 + 7 + 9 + 1 + 1 + 4 + 7 + 9;
PrefixSum[08] = 0 + 7 + 9 + 1 + 1 + 4 + 7 + 9 + 1;
PrefixSum[09] = 0 + 7 + 9 + 1 + 1 + 4 + 7 + 9 + 1 + 1;
PrefixSum[10] = 0 + 7 + 9 + 1 + 1 + 4 + 7 + 9 + 1 + 1 + 4;

해당 배열이 존재함으로 인해서 부분수열의 합을 모두 커버가 가능해진다.
배열[7, 9, 1, 1, 4] 마지막 요소인 4에서 길이가 2인 부분수열의 합을 구하려면
PrefixSum[6] - PreFixSum[4]를 하면 간단하게 처리가 가능하다.
요소4에서 길이가 3인 부분 수열의 합을 구하려고 하면
PrefixSum[7] - PrefixSum[4]를 하면 처리가 가능하다.

이를 일반화하면 다음과 같다.
부분수열의 합 = PrefixSum[시작요소 + 수열길이] - PrefixSum[시작요소];
이렇게 구한 합을 unordered_set에 저장함으로서 중복값 없이 모든 부분수열의 합을 구할 수 있다.


트러블슈팅

채팅서버를 cpp로 구현하는 과정에서
NetMulticast를 안쓰면 모든 Controller를 통해 로직을 돌릴때 for문을 써서 모든 클라이언트에게 전달을 해줘야한다.

NetMulticast는 애초에 브로드캐스트를 위한것인데 이것이 제대로 동작을 하지 않아서 애먹었다.
최초에는 GameMode에 코드를 작성했는데 GameMode는 서버만 가지고 있을 수 있어서 제대로 동작하지 않는다는 사실을 알게 되었다 그래서 Controller에 작성했다.

Controller는 서버와 클라이언트 둘다 가질 수 있지만 NetMulticast는 복제된 대상에만 적용될 수 있다. Controller는 유니크한 클라이언트의 객체기 때문에 복사가 되지 않고 NetMulticast는 동작하지 않는다.

복사가 되면서도 클라이언트 마다 가질 수 있는건 GameState이다. 따라서
GameState에 NetMulticast를 작성하는게 제일 베스트라는 것을 참 힘드렉 알아냈다.

이로서 알게된 사실
서버만 공유할 정보는 Controller 혹은 GameMode에 작성하고
모든 클라이언트와 서버에 공유될 정보는 GameState에 작성하면 문제 없이 서버와 클라이언트가 통신된다.


새로 알게 된 사실

HasAuthority()

if (HasAuthority())
{
	//이 액터가 네트워크 클라이언트에 복제할지 여부를 설정합니다.
	SetReplicates(true);
	//이 액터의 움직임이 네트워크 클라이언트에 복제되는지 여부를 설정합니다.
	SetReplicateMovement(true);
}

HasAuthority()는 서버의 권한이 있는지 확인하는 함수이다 이게 true라면 서버다.

GetAuthGameMode()

이 함수를 통해 NetMode를 알 수 있다. 채팅서버는 RPCs로 만들기 위해서 ListenServer로 설정되어있다.

BlueprintAssignable

멀티캐스트 델리게이트를 만들때 서버와 통신하기 위해서 사용한다.
사용하지 않았다.
UFUNCTION의 지정자로도 충분히 채팅서버를 구현하는데 부족함이 없기 때문이었다.
하위 오브젝트와 통신할 일이 생기면 쓰게되겠지만 지금은 잘 모르겠다.

내일 할 일

Blueprint로 채팅서버를 구현해보자.

마무리

병원에 다녀오고 허리도 안아프고, 평균수면시간을 지키니 장운동도 정상적으로 하는거 같다.
건강이 어느정도 회복되니 코드도 잘짜지고 운동도 잘된다.
건강이 최고다.

profile
취미로 게임하는사람

0개의 댓글