반복 조건을 수정하니 통과되었습니다.
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<int> sequence, int k) {
vector<int> answer;
int sum = sequence[0];
int len = 1000000, limit = sequence.size() - 1;
int leftIdx = 0, rightIdx = 0;
while(leftIdx <= rightIdx)
{
if(rightIdx < limit && sum < k)
{
rightIdx++;
sum += sequence[rightIdx];
}
else if(leftIdx < limit && sum > k)
{
sum -= sequence[leftIdx];
leftIdx++;
}
else if(sum == k)
{
if(len > rightIdx - leftIdx)
{
len = rightIdx - leftIdx;
answer = {leftIdx, rightIdx};
}
if(rightIdx + 1 < sequence.size())
{
rightIdx++;
sum+= sequence[rightIdx];
}
else
{
break;
}
}
else
{
leftIdx++;
}
}
if(len > 0 && sequence[limit] == k)
{
answer = {limit, limit};
}
return answer;
}
테스트 1 〉 통과 (0.01ms, 4.21MB)
테스트 2 〉 통과 (0.01ms, 4.21MB)
테스트 3 〉 통과 (0.01ms, 4.2MB)
테스트 4 〉 통과 (0.01ms, 3.67MB)
테스트 5 〉 통과 (0.06ms, 4.2MB)
테스트 6 〉 통과 (0.11ms, 4.26MB)
테스트 7 〉 통과 (0.30ms, 4.91MB)
테스트 8 〉 통과 (0.59ms, 6.48MB)
테스트 9 〉 통과 (1.73ms, 9.91MB)
테스트 10 〉 통과 (2.82ms, 19.7MB)
테스트 11 〉 통과 (5.78ms, 36.2MB)
테스트 12 〉 통과 (5.47ms, 36.2MB)
테스트 13 〉 통과 (5.48ms, 36.3MB)
테스트 14 〉 통과 (5.57ms, 36.1MB)
테스트 15 〉 통과 (5.59ms, 36.3MB)
테스트 16 〉 통과 (3.17ms, 36.7MB)
테스트 17 〉 통과 (7.11ms, 36.7MB)
테스트 18 〉 통과 (0.01ms, 4.17MB)
테스트 19 〉 통과 (0.01ms, 4.21MB)
테스트 20 〉 통과 (0.01ms, 4.21MB)
테스트 21 〉 통과 (0.01ms, 4.18MB)
테스트 22 〉 통과 (0.01ms, 4.21MB)
테스트 23 〉 통과 (0.01ms, 3.59MB)
테스트 24 〉 통과 (5.25ms, 34.7MB)
테스트 25 〉 통과 (4.36ms, 34.6MB)
테스트 26 〉 통과 (5.71ms, 34.6MB)
테스트 27 〉 통과 (5.74ms, 34.6MB)
테스트 28 〉 통과 (8.39ms, 34.6MB)
테스트 29 〉 통과 (4.30ms, 34.6MB)
테스트 30 〉 통과 (5.46ms, 36.6MB)
테스트 31 〉 통과 (0.01ms, 4.14MB)
테스트 32 〉 통과 (0.01ms, 4.22MB)
테스트 33 〉 통과 (0.01ms, 4.14MB)
테스트 34 〉 통과 (0.01ms, 4.02MB)
AVGMissionItemBase::OnInteractWith가 AVGEquippableActor::OnInteractWith를 Super호출하면서Server_EquipItem이 실행되고, 그 직후 OnPickedUp`도 호출되어 Attach와 상태 설정이 이중으로 실행되는 문제가 있었습니다.
OnInteractWith()
→ Super::OnInteractWith()
→ EquipComp->Server_EquipItem() ← Attach + 슬롯 등록
→ OnPickedUp() ← Carrier 설정 + SetStateTag + Attach 재시도
Server_EquipItem 내부에는 GetAttachParentActor() != nullptr이면 장착을 거부하는 검증이 있어서, 실행 순서에 따라 장착이 거부되고 있었습니다.
Super 호출을 제거하고 책임을 분리했습니다. EquipmentData 설정 문제도 함께 발견되어, 별개로 만들었던 ItemData 대신 MissionItemDataAsset을 상속한 DataAsset을 EquipmentData에 직접 등록하는 방식으로 변경했습니다.
void AVGMissionItemBase::OnInteractWith(AActor* Interactor, const FTransform& InteractTransform)
{
if (!HasAuthority()) return;
if (!CanInteractWith(Interactor)) return;
OnPickedUp(Interactor);
if (UVGEquipmentComponent* EquipComp =
Interactor->FindComponentByClass<UVGEquipmentComponent>())
{
EquipComp->Server_EquipItem(this);
}
}
석상, 제단, 상자 미션이 상속 중인 AVGMissionAllGimmicksClear::SpawnRewardItems에서 보상 아이템 스폰 위치를 LastContributor 기준에서 미션 액터 위치 기준으로 변경했습니다. 마지막 기여자의 근처가 아닌 지정된 위치(상자 안, 제단 위, 석상 등의 중간 위치)에서 생성되는 편이 더 자연스럽다고 생각합니다.
// 수정 전 — LastContributor가 없으면 스폰 실패
FVector SpawnLocation = LastContributor->GetActorLocation()
+ LastContributor->GetActorForwardVector() * 100.f;
// 수정 후 — 미션 액터 위치 기준
FVector SpawnLocation = GetActorLocation()
+ GetActorForwardVector() * 100.f;
SpawnLocation.Z += 50.f;
TimedLever - 제한된 시간 내에 지정된 레버들을 모두 올리는 미션 에서 시간이 경과되었을 때 레버가 초기화되는 문제가 발생했습니다.
확인결과 : DataAsset에 설정된 제한시간 값이 0.f로 되어있었습니다. 30.f로 수정한 후 다시 테스트해 본 결과 정상적으로 동작하는 것을 확인했습니다.
ItemDataAsset을 확인한 결과 내부에 Item의 Tag 설정이 풀려있었습니다.
멍청하게도 서버에서만 부착 로직을 실행해 놓고서 그것이 왜 클라리언트에 적용되지 않는 지를 찾아해메고 있었습니다. 현재 수정을 진행했지만 부착 위치가 어긋나거나 아예 서버와의 연결이 끊겨버리는 현상이 발생하는 등의 문제가 발생하고 있습니다.
protected:
UFUNCTION()
void OnRep_AttachmentTargetActor();
UFUNCTION()
void OnRep_AttachmentRelativeLocation();
protected:
UPROPERTY(ReplicatedUsing=OnRep_AttachmentTargetActor)
TObjectPtr<AActor> AttachmentTargetActor;
UPROPERTY(ReplicatedUsing=OnRep_AttachmentRelativeLocation)
FVector AttachmentRelativeLocation;
`
void AVGMissionItemCarry::OnRep_AttachmentTargetActor()
{
AttachToActor(AttachmentTargetActor,
FAttachmentTransformRules::SnapToTargetNotIncludingScale);
}
void AVGMissionItemCarry::OnRep_AttachmentRelativeLocation()
{
if (AttachmentTargetActor)
{
this->SetActorRelativeLocation(AttachmentRelativeLocation);
SetActorRotation(FRotator(0.f));
}
}