오늘의 목표
- 아침 코드카타
- 언리얼 마스터 4강 과제 - 템플릿/샌드박스로 무기 구현
- 멀티플레이 게임 강의 수강
코드카타
[문제] 두 개 뽑아서 더하기
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
(시간 내에 풀기 실패)
[나의 풀이]
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
bool numFound(int numbers[], size_t numbers_len, int n)
{
for (int i = 0; i < numbers_len; ++i)
{
if (numbers[i] == n)
{
return true;
}
}
return false;
}
// numbers_len은 배열 numbers의 길이입니다.
int* solution(int numbers[], size_t numbers_len) {
// return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
int* answer = (int*)calloc(100, sizeof(int));
// TODO: 길이변경 추가하기
// 이거 그... 완전탐색 쓰면 되는데
for(int i = 0; i < 100; ++i)
{
printf("answer[i]: %d\n", answer[i]);
}
int answer_index = 0;
int sum = 0;
for (int i = 0; i < numbers_len; ++i)
{
for (int j = i + 1; j < numbers_len; ++j)
{
printf("a : %d, b: %d\n", numbers[i], numbers[j]);
sum = numbers[i] + numbers[j];
printf("Sum: %d\n", sum);
// 해당 배열에 같은 수가 존재하는지 확인
if (!numFound(numbers, numbers_len, sum))
{
printf("Add to Answer: %d\n", sum);
answer[answer_index] = sum;
++answer_index;
}
}
}
// 다 넣어놓고 중복되는거 없애버리는 방법도 있나?
// map 쓰면 간단한데...
return answer;
}
[개선점]
내가 작성한 코드에서는
numbers 배열에 같은 수가 있는지 없는지 검사하고 있었다.
answer 배열과 비교해야 올바른 답이 나옴.
개선 후 코드
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
bool numFound(int array[], int array_len, int n)
{
for (int i = 0; i < array_len; ++i)
{
if (array[i] == n)
{
return true;
}
}
return false;
}
int compare(const int* a, const int* b)
{
return (*a - *b);
}
// numbers_len은 배열 numbers의 길이입니다.
int* solution(int numbers[], size_t numbers_len) {
// return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
int* answer = (int*)calloc(numbers_len * (numbers_len - 1) , sizeof(int));
// TODO: 길이변경 추가하기
// 이거 그... 완전탐색 쓰면 되는데
for(int i = 0; i < numbers_len; ++i)
{
printf("answer[i]: %d\n", answer[i]);
}
int answer_index = 0;
int sum = 0;
for (int i = 0; i < numbers_len; ++i)
{
for (int j = i + 1; j < numbers_len; ++j)
{
printf("a : %d, b: %d\n", numbers[i], numbers[j]);
sum = numbers[i] + numbers[j];
printf("Sum: %d\n", sum);
// 해당 배열에 같은 수가 존재하는지 확인
if (!numFound(answer, 100, sum))
{
printf("Add to Answer: %d\n", sum);
answer[answer_index] = sum;
++answer_index;
}
}
}
int answer_len = answer_index;
// answer에서 남는 저장공간 잘라내기
// answer_index 사용
answer = realloc(answer, answer_len * sizeof(int));
qsort(answer, sizeof(int), answer_len, compare);
// 다 넣어놓고 중복되는거 없애버리는 방법도 있나?
// map 쓰면 간단한데...
return answer;
}
최종 값은 제대로 나오는데 정렬이 제대로 되지 않아서 정렬 코드를 추가했다.
정렬을 추가하고 보니 배열에서 저장공간이 남아 0이 최우선값으로 정렬되어서, 배열 저장공간을 동적으로 바꿔주는 로직을 추가했다. 그런데 실행한 결과값에서 쓰레기값이 나왔다.

출력값을 보니 내가 answer_len * (answer_len - 1)으로 할당한 저장공간이 제대로 적용되지 않은 것 같다.
[개선점]
1. 하드코딩해둔 100이라는 사이즈를 수정하지 않았다. answer_index로 변형해주었다.
// 수정 전
// 해당 배열에 같은 수가 존재하는지 확인
if (!numFound(answer, 100, sum))
{
printf("Add to Answer: %d\n", sum);
answer[answer_index] = sum;
++answer_index;
}
// 수정 후
// 해당 배열에 같은 수가 존재하는지 확인
if (!numFound(answer, answer_index, sum))
{
printf("Add to Answer: %d\n", sum);
answer[answer_index] = sum;
++answer_index;
}
2. qsort의 인자
// 수정 전
qsort(answer, sizeof(int), answer_len, compare);
// 수정 후
qsort(answer, answer_len, sizeof(int), compare);
void qsort(void *base, size_t num, size_t size, int (*compare)(const void *, const void *));
qsort(정렬할 배열, 요소 개수, 요소 크기, 비교 함수)
(!) 개선 후 답이 제대로 나온 걸 보니 동적 할당 문제가 아니라 qsort 정렬 문제로 쓰레기값이 나왔던 것 같다.
[최종 코드]
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
bool numFound(int array[], int array_len, int n)
{
for (int i = 0; i < array_len; ++i)
{
if (array[i] == n)
{
return true;
}
}
return false;
}
int compare(const int* a, const int* b)
{
return (*a - *b);
}
// numbers_len은 배열 numbers의 길이입니다.
int* solution(int numbers[], size_t numbers_len) {
// return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
int* answer = (int*)calloc(numbers_len * (numbers_len - 1) , sizeof(int));
for(int i = 0; i < numbers_len; ++i)
{
printf("answer[i]: %d\n", answer[i]);
}
int answer_index = 0;
int sum = 0;
for (int i = 0; i < numbers_len; ++i)
{
for (int j = i + 1; j < numbers_len; ++j)
{
printf("a : %d, b: %d\n", numbers[i], numbers[j]);
sum = numbers[i] + numbers[j];
printf("Sum: %d\n", sum);
// 해당 배열에 같은 수가 존재하는지 확인
if (!numFound(answer, answer_index, sum))
{
printf("Add to Answer: %d\n", sum);
answer[answer_index] = sum;
++answer_index;
}
}
}
int answer_len = answer_index;
// answer에서 남는 저장공간 잘라내기
answer = realloc(answer, answer_len * sizeof(int));
// 정렬
qsort(answer, answer_len, sizeof(int), compare);
return answer;
}
개념 정리
1. int* 배열 순환
c언어에서는 int* 배열 순환을 위한 array_index를 따로 관리해야함. (length 함수 없음)
2. calloc
할당과 동시에 0으로 배열 초기화
int *arr = (int *)calloc(size, sizeof(int));
파라미터: (배열 사이즈, 각 인자 크기);
3. realloc
void* realloc(void* ptr, size_t new_size);
파라미터: (재할당할 함수 주소, 재할당할 크기)
4. qsort
void qsort(void *base, size_t num, size_t size, int (*compare)(const void *, const void *));
파라미터: (정렬할 배열, 요소 개수, 요소 크기, 비교 함수)
언리얼 마스터 과제 4번 - 템플릿/샌드박스로 무기 구현
권장하는 헤더 작성 예시
cppUCLASS()
class MYPROJECT_API AMyCharacter : public ACharacter
{
GENERATED_BODY()
public:
// 1. 생성자 및 소멸자
AMyCharacter();
virtual ~AMyCharacter();
protected:
// 2. 컴포넌트
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
class USpringArmComponent* SpringArm;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
class UCameraComponent* Camera;
public:
// 3. 에디터에 노출된 프로퍼티 (Public)
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats")
float MaxHealth;
protected:
// 4. 에디터에 노출된 프로퍼티 (Protected)
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Weapon")
TSubclassOf<class AWeapon> DefaultWeaponClass;
private:
// 5. 내부 프로퍼티
UPROPERTY(EditAnywhere, meta = (AllowPrivateAccess = "true"))
float MoveSpeed;
public:
// 6. 노출된 함수 / 이벤트
UFUNCTION(BlueprintCallable, Category = "Action")
void Shoot();
UFUNCTION(BlueprintNativeEvent, Category = "Damage")
void TakeDamage(float DamageAmount);
protected:
// 7. C++ 전용 가상 함수
virtual void BeginPlay() override;
virtual void Tick(float DeltaTime) override;
public:
// 8. 게터/세터 함수
float GetMaxHealth() const { return MaxHealth; }
void SetMoveSpeed(float NewSpeed) { MoveSpeed = NewSpeed; }
};'Unreal5 공부 > TIL' 카테고리의 다른 글
| 2026/06/05 TIL (0) | 2026.06.05 |
|---|---|
| 2026/06/04 TIL (0) | 2026.06.05 |
| 2026/06/01 TIL (0) | 2026.06.01 |
| 2026/05/29 TIL (0) | 2026.05.29 |
| 2026/05/28 TIL (0) | 2026.05.28 |