오늘의 목표

아침 코드카타

언리얼 마스터 이번주 과제 (기한 ~목)

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

+ Recent posts