오늘의 목표
- 아침 코드카타 풀기
- C++ 문법 1주차 숙제 추가 파트 구현
- C++ 문법 2-1. 자원 관리 강의 수강
- C++ 문법 2-1. 자원 관리 복습
추가 목표:
C++ 문법 2-2. 템플릿 강의 수강
1. 코드카타
<오늘 푼 문제> 자연수 뒤집어 배열로 만들기
내가 처음으로 구현했던 코드는 다음과 같다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int* solution(long long n) {
// 리턴할 값은 메모리를 동적 할당해주세요.
int len = 0;
int num = n;
while( num >= 1 ){
len += 1;
num /= 10;
}
int* answer = (int*)malloc(sizeof(long long int) * len);
num = n;
for(int i = 0; i < len; ++i){
answer[i] = num%10;
num /= 10;
}
return answer;
}
<문제 발생>
로직자체는 잘 작동하는데, 일부 테스트 케이스를 통과하지 못했다.
아무리 확인해도 이유를 모르겠어서 검색해봤더니, long long n을 받는 변수 num이 int형으로 선언된 것이 문제였다.
큰 입력값을 받았을 때 제대로 처리하지 못해서 생긴 문제이다. 바로 long long num으로 변경해준다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int* solution(long long n) {
// 리턴할 값은 메모리를 동적 할당해주세요.
int len = 0;
long long num = n;
while( num >= 1 ){
len += 1;
num /= 10;
}
int* answer = (int*)malloc(sizeof(long long int) * len);
num = n;
for(int i = 0; i < len; ++i){
answer[i] = num%10;
num /= 10;
}
return answer;
}
<실행>
최종 코드는 제대로 모든 테스트 케이스를 통과했다. 해결~
2. C++ 문법 1주차 숙제 도전 파트 구현
필수 파트까지는 지난 번에 구현을 완료했으므로 도전 파트 구현에 들어간다.
참고로 이전에 구현한 코드는 다음과 같다.
#include <iostream>
using namespace std;
int HP, MP, AP, DP;
void setPotion(int count, int* p_HPPotion, int* p_MPPotion) {
switch (count) {
case 1:
if (*p_MPPotion != 0) {
*p_MPPotion -= 1;
MP += 20;
cout << "* MP가 20 증가되었습니다. 포션이 1개 차감됩니다." << endl;
cout << "남은 포션 수: " << *p_MPPotion << endl;
}
else {
cout << "포션이 부족합니다." << endl;
}
break;
case 2:
if (*p_HPPotion != 0) {
*p_HPPotion -= 1;
HP += 20;
cout << "* HP가 20 증가되었습니다. 포션이 1개 차감됩니다." << endl;
cout << "남은 포션 수: " << *p_HPPotion << endl;
}
else {
cout << "포션이 부족합니다." << endl;
}
break;
case 3: // 공격력 2배
AP *= 2;
cout << "* 공격력이 2배로 증가되었습니다." << endl;
break;
case 4: // 방어력 2배
DP *= 2;
cout << "* 방어력이 2배로 증가되었습니다." << endl;
break;
case 5: // 능력치 출력
cout << "HP: " << HP << endl;
cout << "MP: " << MP << endl;
cout << "공격력: " << AP << endl;
cout << "방어력: " << DP << endl;
break;
case 6:
*p_HPPotion += 1;
*p_MPPotion += 1;
cout << "* 레벨업! HP/MP 포션이 지급됩니다." << endl;
cout << "남은 HP/MP 포션 수 : " << *p_HPPotion << "/" << *p_MPPotion << endl;
break;
default:
break;
}
}
int main() {
int status[4] = { 0 };
int HPPotion, MPPotion;
cout << "HP와 MP를 차례대로 입력하세요: ";
cin >> HP >> MP;
// 입력값이 50 이하일 시 다시 입력받기
while (1) {
if (HP <= 50 || MP <= 50) {
cout << "50 이하는 입력할 수 없습니다. 다시 입력해주세요: ";
cin >> HP >> MP;
}
else {
break;
}
}
status[0] = HP;
status[1] = MP;
cout << "공격력과 방어력을 차례대로 입력하세요: ";
cin >> AP >> DP;
//입력값이 0 이하일 시 다시 입력받기
while (1) {
if (AP <= 0 || DP <= 0) {
cout << "0 이하는 입력할 수 없습니다. 다시 입력해주세요: ";
cin >> AP >> DP;
}
else {
break;
}
}
status[2] = AP;
status[3] = DP;
HPPotion = 5, MPPotion = 5;
cout << "* 포션이 지급되었습니다. (HP, MP 포션 각 5개)" << endl;
cout << "=============================================" << endl;
// 메뉴판 무한루프
int count;
while (1) {
cout << "<스탯 관리 시스템>" << endl;
cout << "1.HP UP" << endl;
cout << "2.MP UP" << endl;
cout << "3.공격력 UP" << endl;
cout << "4.방어력 UP" << endl;
cout << "5.현재 능력치" << endl;
cout << "6.Level Up" << endl;
cout << "0.나가기" << endl;
cout << "번호 입력: ";
cin >> count;
if (count == 0) {
cout << "프로그램을 종료합니다." << endl;
break;
}
// 포션 시스템
setPotion(count, &HPPotion, &MPPotion);
}
return 0;
}
<도전 과제>
1. 레벨 시스템 구현
level 변수를 만들어 6번을 선택할 때 마다 레벨을 1씩 증가시키는 시스템
<구상>
level 변수를 전역변수로 선언하고 0으로 초기화시킨다.
기존에 구현한 setPotion() 함수의 switch case 6번에 level 변수를 1씩 증가시키는 로직을 추가한다.
<구현>
case 6:
++LV;
*p_HPPotion += 1;
*p_MPPotion += 1;
cout << "* 레벨업! HP/MP 포션이 지급됩니다." << endl;
cout << "남은 HP/MP 포션 수 : " << *p_HPPotion << "/" << *p_MPPotion << endl;
break;
2. 함수 활용
포션을 충전하는 기능을 별도의 함수로 분리한다.
<구상>
setPotion()함수처럼 parameter를 포인터로 해서 HPPotion과 MPPotion의 주소값을 받은 뒤 각 포션 개수를 하나씩 증가시킨다. 이것을 setPotion() switch case 6 내에 집어넣는다.
<구현>
구현한 함수는 다음과 같다.
void addPotion(int* p_HPPotion, int* p_MPPotion) {
++(*p_HPPotion);
++(*p_MPPotion);
}
case 6:
++LV;
addPotion(p_HPPotion, p_MPPotion);
cout << "* 레벨업! HP/MP 포션이 지급됩니다." << endl;
cout << "남은 HP/MP 포션 수 : " << *p_HPPotion << "/" << *p_MPPotion << endl;
break;
만든 함수를 setPotion 안에 넣어줬다.
<출력 결과>
HP와 MP를 차례대로 입력하세요: 60 60
공격력과 방어력을 차례대로 입력하세요: 30 30
* 포션이 지급되었습니다. (HP, MP 포션 각 5개)
=============================================
<스탯 관리 시스템>
1.HP UP
2.MP UP
3.공격력 UP
4.방어력 UP
5.현재 능력치
6.Level Up
0.나가기
번호 입력: 1
* MP가 20 증가되었습니다. 포션이 1개 차감됩니다.
남은 포션 수: 4
<스탯 관리 시스템>
1.HP UP
2.MP UP
3.공격력 UP
4.방어력 UP
5.현재 능력치
6.Level Up
0.나가기
번호 입력: 2
* HP가 20 증가되었습니다. 포션이 1개 차감됩니다.
남은 포션 수: 4
<스탯 관리 시스템>
1.HP UP
2.MP UP
3.공격력 UP
4.방어력 UP
5.현재 능력치
6.Level Up
0.나가기
번호 입력: 6
* 레벨업! HP/MP 포션이 지급됩니다.
남은 HP/MP 포션 수 : 5/5 // 4/4로 깎였던 포션 개수가 채워졌다.
3. 스탯 정보 추가1
5번 선택으로 현재 능력치 출력 시, 현재 레벨도 보여주기
<구상>
LV이 전역변수이므로 그냥 cout으로 출력해주면 될 것 같다.
<구현>
case 5: // 능력치 출력
cout << "LV: " << LV << endl;
cout << "HP: " << HP << endl;
cout << "MP: " << MP << endl;
cout << "공격력: " << AP << endl;
cout << "방어력: " << DP << endl;
break;
레벨이니까 제일 먼저 출력해줬다.
<출력 결과>
HP와 MP를 차례대로 입력하세요: 60 60
공격력과 방어력을 차례대로 입력하세요: 30 30
* 포션이 지급되었습니다. (HP, MP 포션 각 5개)
=============================================
<스탯 관리 시스템>
1.HP UP
2.MP UP
3.공격력 UP
4.방어력 UP
5.현재 능력치
6.Level Up
0.나가기
번호 입력 : 5
LV: 0
HP: 60
MP: 60
공격력: 30
방어력: 30
<스탯 관리 시스템>
1.HP UP
2.MP UP
3.공격력 UP
4.방어력 UP
5.현재 능력치
6.Level Up
0.나가기
번호 입력 : 6
* 레벨업! HP/MP 포션이 지급됩니다.
남은 HP/MP 포션 수 : 6/6
<스탯 관리 시스템>
1.HP UP
2.MP UP
3.공격력 UP
4.방어력 UP
5.현재 능력치
6.Level Up
0.나가기
번호 입력 : 5
LV: 1
HP: 60
MP: 60
공격력: 30
방어력: 30
레벨업이 잘 되는 것을 확인할 수 있다.
+가독성이 떨어지는 것 같아서 스탯 관리 시스템을 앞 뒤로 띄웠다.
+생각해보니 레벨이 0으로 시작하는 건 이상한 것 같아 1로 초기화해주기로 한다.
4. 스탯 정보 추가2
5번 선택으로 현재 능력치 출력 시, 남은 포션 개수 보여주기
<구상>
이건 레벨업 시 포션 개수를 보여주는 로직이랑 똑같이 하면 되겠다.
<구현>
case 5: // 능력치 출력
cout << "LV: " << LV << endl;
cout << "HP: " << HP << endl;
cout << "MP: " << MP << endl;
cout << "공격력: " << AP << endl;
cout << "방어력: " << DP << endl;
cout << "HP 포션: " << *p_HPPotion << endl;
cout << "MP 포션: " << *p_MPPotion << endl;
break;
<출력 결과>
HP와 MP를 차례대로 입력하세요: 60 60
공격력과 방어력을 차례대로 입력하세요: 30 30
* 포션이 지급되었습니다. (HP, MP 포션 각 5개)
=============================================
<스탯 관리 시스템>
1.HP UP
2.MP UP
3.공격력 UP
4.방어력 UP
5.현재 능력치
6.Level Up
0.나가기
번호 입력 : 5
LV: 1
HP: 60
MP: 60
공격력: 30
방어력: 30
HP 포션: 5
MP 포션: 5
만족.
5. 확장
공격력/방어력 외 힘, 민첩, 지능 등 나만의 새로운 스탯을 추가해서 나만의 게임 만들기
<구상>
지금까지 쓴 코드에 이성(SAN)스탯을 추가해서 TRPG 느낌으로 만들고 싶다.
이성은 0~100 사이의 스탯으로 설정한다.
이성치를 설정하고 깎는 방법에는 주사위 굴리기를 사용한다.
처음으로 설정되는 이성치는 6면체 주사위를 세 번 굴린 값에 5를 곱해 초기화한다.
1. 랜덤하게 6면주사위를 굴리는 로직
<random> 라이브러리의 random_device를 사용하여 1부터 6까지의 랜덤 숫자를 반환하는 함수를 만든다.
int rollDice() {
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<int> dis(1, 6);
return dis(gen);
}
2. 6면 주사위를 굴린 값으로 이성치를 초기화하는 로직
처음에 게임을 시작하면 6면 주사위를 세 번 굴린 값에 5를 곱해 이성치를 초기화한다.
6면 주사위를 세번 굴린 값에 5를 더해서 초기화 값을 만드는 것은 함수를 따로 분리하는 것이 좋을 것 같다.
// 이성치 초기화값 계산
int setSAN() {
int result = 0;
for (int i = 0; i < 3; ++i) {
result += roll1d6();
}
return result += 5;
}
이성치가 잘 초기화되는지 확인하기 위해 현재 능력치 옵션에서 이성치도 함께 출력하도록 만들어 주자.
HP와 MP를 차례대로 입력하세요: 60 60
공격력과 방어력을 차례대로 입력하세요: 30 30
* 포션이 지급되었습니다. (HP, MP 포션 각 5개)
=============================================
<스탯 관리 시스템>
1.HP UP
2.MP UP
3.공격력 UP
4.방어력 UP
5.현재 능력치
6.Level Up
0.나가기
번호 입력 : 5
LV: 1
HP: 60
MP: 60
공격력: 30
방어력: 30
이성: 65
HP 포션: 5
MP 포션: 5
제대로 출력이 된다.
3. C++ 문법 2-1. 자원 관리 강의 수강
(수강 완료!)
오늘 배운 것
언리얼에서 메모리를 정리할 때 사용하는 가비지 컬렉션과 마크&스윕 알고리즘
프로그램 실행 중에 구조와 상태를 검사하고 수정할 수 있는 리플렉션
오늘 하지 못한 일 : 2-1. 자원관리 복습
'Unreal5 공부 > TIL' 카테고리의 다른 글
| 2026/03/18 TIL (0) | 2026.03.18 |
|---|---|
| 2026/03/17 TIL (0) | 2026.03.17 |
| 2026/03/13 TIL (0) | 2026.03.13 |
| 2026/03/11 TIL (0) | 2026.03.11 |
| 2026/03/10 TIL (0) | 2026.03.10 |