오늘의 목표

  • 아침 코드카타 풀기
  • 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

+ Recent posts