오늘의 목표
- 아침 코드카타
- 언리얼 기초 라이브세션 수강
- 과제 6번 도전과제
- 언리얼 강좌 2-1 수강
코드카타
[문제]문자열 내림차순으로 배치하기
문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
bool charCompare(char* a, char* b)
{
return a > b;
}
// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
char* solution(const char* s) {
// return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
char* answer = (char*)malloc(1);
int len = strlen(s);
char* str = (char*)malloc(len);
strcpy(str, s);
qsort(str, sizeof(char), len, charCompare);
realloc(answer, len);
strcpy(str, answer);
return answer;
}
qsort를 이용해 내림차순으로 정렬해보려 했으나 실패했다.
참고 자료 없이 코딩하려니 어렵구나...
[오류 파악]
동적 할당 메모리 오류
char* str = (char*)malloc(len); // 문자열 종료 문자 '\0' 할당할 메모리가 부족
// 수정
char* str = (char*)malloc(len+1);
qsort 비교 함수 인자 오류
bool charCompare(char* a, char* b)
{
return a > b;
}
/*
...
*/
qsort(str, sizeof(char), len, charCompare);
// qsort의 비교 함수는 반드시 const void*를 받아야 함
// qsort 인자 순서 오류
// 수정
int charCompare(const void* a, const void* b)
{
return (*(char*)b - *(char*)a);
}
qsort(str, len, sizof(char), charCompare);
realloc 반환값 미사용 + strcpy 방향 오류
// 오류 코드
realloc(answer, len); // realloc 반환값 할당을 안 함
strcpy(str, answer); // 방향 반대
// 수정 코드
answer = (char*)realloc(answer, len + 1);
strcpy(answer, str);
이렇게 했더니 정상 작동한다.
개념 정리
qsort()
헤더: #include <stdlib.h>
함수 원형: void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *));
사용법: void qsort(정렬할 배열, 배열 사이즈, 배열 원소 사이즈, 비교 함수);
- realloc을 할 때는 항상 재할당한 값 원래 변수에 할당해주기
- 문자열 끝 문자 '\0'를 위한 메모리 할당하는 거 잊지 말기.
다른 사람 답 확인해보기
6번 과제 도전 기능
// Fill out your copyright notice in the Description page of Project Settings.
#include "SpawnActor.h"
#include "DisappearingActor.h"
#include "MovingActor.h"
#include "RotatingActor.h"
#include "TeleportingActor.h"
// Sets default values
ASpawnActor::ASpawnActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
SpawnClasses.Add(ADisappearingActor::StaticClass());
SpawnClasses.Add(AMovingActor::StaticClass());
SpawnClasses.Add(ARotatingActor::StaticClass());
SpawnClasses.Add(ATeleportingActor::StaticClass());
}
// Called when the game starts or when spawned
void ASpawnActor::BeginPlay()
{
Super::BeginPlay();
SpawnPlatforms();
}
void ASpawnActor::SpawnPlatforms()
{
for (int32 i = 0; i < SpawnCount; ++i)
{
if (SpawnClasses.IsEmpty()) return;
int32 RandIndex = FMath::RandRange(0, SpawnClasses.Num() - 1);
TSubclassOf<AActor> ChosenClass = SpawnClasses[RandIndex];
FActorSpawnParameters Params;
Params.SpawnCollisionHandlingOverride =
ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
GetWorld()->SpawnActor<AActor>(
ChosenClass,
GetRandomSpawnLocation(),
FRotator::ZeroRotator,
Params
);
}
}
FVector ASpawnActor::GetRandomSpawnLocation()
{
FVector Origin = GetActorLocation();
return FVector(
Origin.X + FMath::FRandRange(-SpawnRange.X, SpawnRange.X),
Origin.Y + FMath::FRandRange(-SpawnRange.Y, SpawnRange.Y),
Origin.Z
);
}
지난번에 작성한 SpawnActor 클래스이다.
SpawnActor 클래스 이름이 SpawnActor 함수랑 헷갈리는 것 같아 MapGenerator라고 따로 클래스를 만들어 줬다.
MapGenerator를 맵에 두고 실행을 시켰더니, 아무 것도 나타나지 않았다.
MapGenerator가 (0, 0, 0) 위치에 생성되었기 때문이다. SceneRoot도 붙여주지 않아 움직일 수 없었기 때문에 SceneRoot을 붙여주었다.
언리얼 마스터 라이브세션 (수강완료)
과제

'Unreal5 공부 > TIL' 카테고리의 다른 글
| 2026/04/14 TIL (0) | 2026.04.14 |
|---|---|
| 2026/04/13 TIL (1) | 2026.04.13 |
| 2026/4/9 TIL (0) | 2026.04.09 |
| 2026/04/08 TIL (0) | 2026.04.08 |
| 2026/04/07 TIL (0) | 2026.04.07 |