해당 문제는 배열을 가지고 풀면 시간초과로 풀 수 없다.
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;
}
깎으면 맵을 하나 안쓰고도 풀 수 있을거 같은데 그래도 저게 더 빠르겠지 싶다.
Log출력하는 것을 학습하였다.
UE_LOG(카테고리, 심각도, TEXT());
//다음과 같이 출력이 가능
| 심각도 | 출력색상 |
|---|---|
| Log | 일반적인 메시지, 색상이 없음. |
| Display | 퍼렁색 |
| Warning | 주황색 또는 노랑색 |
| Error | 뻘건색 |
| Fatal | 뻘건색(프로그램 종료) |
// 함수: 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을 활용한 풀이가 보였지만
나는 이 방법이 좋았다.
게임 시작 시점에서 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() 는 벡터의 거리계산 공식을 넣은 착한 함수다 없으면 직접 만들려고 했는데 다행히 있어서 귀찮은 과정이 생략되었다.