오늘의 목표
아침 코드카타
언리얼 마스터 이번주 과제 (기한 ~목)
7번 과제 도전기능 구현 - 비행 모드 구현하기
코드카타
[문제] 삼총사
배열에서 합이 0이 되는 숫자 3개의 조합 개수 찾기
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// number_len은 배열 number의 길이입니다.
int solution(int number[], size_t number_len) {
int answer = 0;
int lastIndex = number_len -1;
//int len = int(number_len);
int std1 = 0, std2 = 1, std3 = 2;
while(std1 <= (lastIndex -2))
{
if ((number[std1] + number[std2] + number[std3]) == 0)
{
++answer;
}
if(std3 == lastIndex && std2 < lastIndex - 1)
{
++std2;
std3 = std2 + 1;
}
else if(std3 == lastIndex && std2 == lastIndex - 1)
{
++std1;
std2 = std1 + 1;
std3 = std2 + 1; // 이걸 추가 안 해서 헤맸다...
}
else if(std3 < lastIndex)
{
++std3;
}
}
return answer;
}
인덱스를 다루는 파트는 인덱스 바운더리를 잘 파악해서 오류가 없도록 심혈을 기울여야겠다.
[개선점]
for loop이 아니라 while loop으로 작성한 이유는 이렇게 하면 시간이 조금 줄어들까 싶어서였는데, 어짜피 모든 원소를 순회하는 거라 시간복잡도는 동일하다.
따로 인덱스를 관리하느라 의도파악이 어렵고 오히려 for loop이 직관적이고 편할 것 같다.
시간 복잡도를 줄이려면 배열을 정렬한 뒤 std1은 기존처럼 순회하고, std2와 std3으로 합의 크기가 양수인지 음수인지 비교해가며 효율적으로 0을 만드는 조합을 찾는 방법이 나을 듯하다.
for loop으로 다시 코드를 작성해봤다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int solution(int number[], size_t number_len) {
int answer = 0;
for(int std1 = 0; std1 < number_len-2; ++std1)
{
for(int std2 = std1 + 1; std2 < number_len-1; ++std2)
{
for(int std3 = std2 + 1; std3 < number_len; ++std3)
{
if((number[std1] + number[std2] + number[std3]) == 0)
{
++answer;
}
}
}
}
return answer;
}
이렇게 간단한 걸 왜 돌아갔는지...
명확한 의도를 가지고 내 코드가 어떻게 작동하는지 파악하고 작성하는 습관을 들이자.
언리얼 마스터 과제 2
TArray로 인벤토리를 만들고 특정 호칭이 있어야 사용할 수 있는 아이템 구현하기
USTRUCT(BlueprintType) // ?
struct FItemInfo
{
GENERATED_BODY() // ?
FString Name;
int32 value;
FString RequiredTitle;
};
USTRUCT(BlueprintType)
-> BlueprintType으로 설정할 시 블루프린트에서도 이 Struct를 변수로 사용할 수 있게 된다.
GENERATED_BODY()
-> 리플렉션, 가비지 시스템 등에 필요한 코드를 생성
이후 FItemInfo로 아이템을 생성하려는데 Name, Value, RequiredTitle에 전부 접근이 안 되는 오류가 생겼다.
찾아보니 UPROPERTY를 붙이지 않아서 그럴 수도 있다고 한다.
USTRUCT(BlueprintType)
struct FItemInfo
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString Name;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 Value;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString RequiredTitle;
};
void AInventory::BeginPlay()
{
Super::BeginPlay();
// print Item info
for (int i = 0; i < ItemList.Num(); ++i)
{
FItem* Info = ItemList.Find(Inventory[i]); // Key가 존재하는지 탐색
if (Info) {
GEngine->AddOnScreenDebugMessage(
-1,
5.0f,
FColor::Red,
FString::Printf(
TEXT("Name: %s, Value: %d, RequiredTitle: %s"),
*(Info->Name), // FString은 *로 역참조 // -> 왜?
Info->Value,
*(Info->RequiredTitle)
)
);
}
}
}
Map에서 Key가 존재하는지 확인 후 해당 키로 접근하여 메세지 출력.
FString은 char*타입을 요구하기 때문에, *로 역참조 하여 Fstring을 const TCHAR*로 변환해준다.
'Unreal5 공부 > TIL' 카테고리의 다른 글
| 2024/04/24 TIL (0) | 2026.04.24 |
|---|---|
| 2026/04/23 TIL (0) | 2026.04.23 |
| 2026/4/21 TIL (0) | 2026.04.21 |
| 2026/04/20 TIL (0) | 2026.04.20 |
| 2026/04/17 TIL (2) | 2026.04.17 |