오늘의 목표

  • 아침 코드카타
  • 언리얼 기초 라이브세션 수강
  • 과제 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

+ Recent posts