2025-01-08_TIL

별빛에소원을·2025년 1월 8일

TeamSparta-Unreal1기-TIL

목록 보기
24/90
post-thumbnail

알고리즘 : 달리기 경주

해당 문제는 배열을 가지고 풀면 시간초과로 풀 수 없다.
Players의 길이 <= 50000 을 보고 될까말까 조마조마했는데 결국 안됬다.
갖은 방법을 다 썼지만 단축 시킬 수 없었고 결국 헤쉬맵을 이용해서 풀이했다.
머리가 잘 돌아가지 않는 상태라 맵사용법을 참고해서 주석을 달면서 풀었다.

#include <string>
#include <vector>
#include <map>
using namespace std;

vector<string> solution(vector<string> players, vector<string> callings) 
{
    vector<string> answer;
    std::map<int, string> mapRank;
	std::map<string, int> mapPlayer;
	for (int i = 0; i < players.size(); ++i)
	{
		mapPlayer[players[i]] = i;
		mapRank[i] = players[i];
	}

	size_t size = callings.size();

	for (size_t i = 0; i < size; ++i)
	{
		//해당 인원의 인덱스를 찾아야한다.
		int index = mapPlayer[callings[i]];
		// index 앞의 선수 이름을 알아야한다.
		string Faward = mapRank[index - 1];

		// 인원의 인덱스를 이전 인덱스와 스왑한다.
		swap(mapRank[index], mapRank[index - 1]);
		swap(mapPlayer[callings[i]], mapPlayer[Faward]);
	}
    for(auto p : mapRank)
    {
        answer.push_back(p.second);
    }
    return answer;
}

깎으면 맵을 하나 안쓰고도 풀 수 있을거 같은데 그래도 저게 더 빠르겠지 싶다.

Unreal C++

Log출력하는 것을 학습하였다.

UE_LOG(카테고리, 심각도, TEXT());
//다음과 같이 출력이 가능
심각도출력색상
Log일반적인 메시지, 색상이 없음.
Display퍼렁색
Warning주황색 또는 노랑색
Error뻘건색
Fatal뻘건색(프로그램 종료)

TArray::Contains 예시

// 함수: ExampleContainsUsage
// 목적: 이 함수는 TArray의 Contains 메서드를 사용하여 배열에 특정 값이 포함되어 있는지 확인하는 방법을 보여줍니다.
//       Contains 메서드는 배열 내에서 주어진 값이 존재하면 true, 존재하지 않으면 false를 반환합니다.
//
// 실행 결과:
// - 배열에 10이 포함되어 있기 때문에 "The array contains the value: 10" 로그가 출력됩니다.
// - 배열에 20은 포함되어 있지 않기 때문에 "The array does not contain the value: 20" 로그가 출력됩니다.
void ExampleContainsUsage()
{
    // 1. 정수형 배열(TArray<int32>) 생성
    TArray<int32> Numbers;

    // 2. 배열에 값 추가
    Numbers.Add(5);  // 배열에 5 추가
    Numbers.Add(10); // 배열에 10 추가
    Numbers.Add(15); // 배열에 15 추가

    // 3. 배열에 특정 값이 포함되어 있는지 확인

    // 첫 번째 값 확인: 10
    int32 SearchValue = 10;
    if (Numbers.Contains(SearchValue))
    {
        UE_LOG(LogTemp, Warning, TEXT("The array contains the value: %d"), SearchValue);
    }
    else
    {
        UE_LOG(LogTemp, Warning, TEXT("The array does not contain the value: %d"), SearchValue);
    }

    // 두 번째 값 확인: 20
    SearchValue = 20;
    if (Numbers.Contains(SearchValue))
    {
        UE_LOG(LogTemp, Warning, TEXT("The array contains the value: %d"), SearchValue);
    }
    else
    {
        UE_LOG(LogTemp, Warning, TEXT("The array does not contain the value: %d"), SearchValue);
    }
}

로또 만들어보기

    int lottoArr[45] = {};
    // 번호생성
    for (int i = 0; i < 45; ++i)
    {
        lottoArr[i] = i + 1;
    }

    // 섞기
    for (int i = 0; i < 100; ++i)
    {
        int n1 = FMath::RandRange(0, 44);
        int n2 = FMath::RandRange(0, 44);
        std::swap(lottoArr[n1], lottoArr[n2]);
    }

	UE_LOG(LogTemp, Warning, TEXT("Lotto Numbers : %d,%d,%d,%d,%d,%d"), 
    lottoArr[0], lottoArr[1], lottoArr[2], lottoArr[3], lottoArr[4], lottoArr[5]);

중복방지 로직을 활용해서 랜덤한 숫자가 나올때 까지 while을 활용한 풀이가 보였지만
나는 이 방법이 좋았다.


과제 5 : 좌표이동

게임 시작 시점에서 Actor하나를 생성해서 좌표를 이동시키는 과제이다
무척 간단하지만 시작 시점을 어떻게 설정할지가 고민이었다. GameMode와 GameInstance는 게임 시작전에 설정을 할 수 있는 클래스이다. 나는 GameInstance를 활용하기로 했고
Owner와 Instigator를 비우고 만들기로 했다. 영향을 줄 Actor를 안만들거니까

void UMyGameInstance::Init()
{
	Super::Init();
	UWorld* world = GetWorld();

	if (world == nullptr)
		return;

	const FRotator Rotation = FRotator::ZeroRotator;
	FVector Location = FVector::ZeroVector;
	FVector Scae = { 1.f,1.f,1.f };
	FTransform transform = { Rotation ,Location,Scae };

	FActorSpawnParameters ActorParam;
	ActorParam.Name = TEXT("MyActor");
	ActorParam.Owner = nullptr;
	ActorParam.Instigator = nullptr;
	ActorParam.SpawnCollisionHandlingOverride = 	ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
	world->SpawnActor<AMyActor2>(Location, Rotation, ActorParam);
}

FVector 기능이 참 좋았다. 직관적이고 명시적이며 우아하다
기능을 구현하고 나서도 이동값은 변화를 주었는데 GetActorLocation 호출할 때 마다 초기 위치여서
한참을 애먹었다. 답은 간단했는데
SceneComponent가 없어서였다. 그래서 생성자에 SceneComponent를 만들고 Mobility를 Movable 설정해주고 동작시키니 정상동작하였다.
FVector::Dist() 는 벡터의 거리계산 공식을 넣은 착한 함수다 없으면 직접 만들려고 했는데 다행히 있어서 귀찮은 과정이 생략되었다.

profile
취미로 게임하는사람

0개의 댓글