오늘의 할일
1. 코드카타 정리
2. 팀프로젝트 정리
3. 다음 학습 목표
정수를 저장한 배열 arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr) {
vector<int> answer;
auto min_it = min_element(arr.begin(), arr.end());
arr.erase(min_it);
answer = arr;
if (arr.size() <= 1) {
answer.push_back(-1);
return answer;
}
return answer;
}
AI가 짜준 간결한 코드
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr) {
// 1. 배열의 길이가 1 이하인 경우 바로 {-1}을 리턴하여 종료합니다.
if (arr.size() <= 1) return {-1};
// 2. 최솟값을 찾음과 동시에 원본 배열에서 삭제합니다.
arr.erase(min_element(arr.begin(), arr.end()));
// 3. 수정된 원본 배열을 그대로 리턴합니다.
return arr;
}
좀 더 빠른 작업 속도로 하려면(-1 반환 경우) 1 이하일 경우에 리턴하는 if문을 맨 처음으로 올려야겠다고 깨달음
Item 구조체현재 Inventory.h 맨 위에 적어두었던 struct Item은 아이템 담당자가 맡는 게 맞다고 판단함.
Inventory.h에서 struct Item { ... }; 부분을 지우고, Item.h 파일을 #include해서 가져다 쓰기#include "../../include/item/Item.h"string Name; // 아이템 이름
string ItemDescription; // 아이템 설명
string ItemDropLocation; // 아이템 드롭 장소
int Price; // 아이템 가격
int ItemCount; // 아이템 갯수
int ItemMaxStack; // 아이템 최대 갯수
-> 작성한 코드에서 변경된 변수 이름 적용
예상 아이템 사용 흐름:
1) 가방에서 1번 포션을 선택함
2) 인벤토리에서 GetItem(1)로 1번 포션의 정보를 꺼내옴
3) UseItem(player, 포션)로 체력 회복
4) ConsumeItem(1)로 포션 갯수 1개 차감
UseRandomItem) 협업Item.h에 UseRandomItem(Player& player, vector<Item>& items)가 있는데 여기서 vector<Item>& items가 인벤토리의 내용물이어서 인벤토리 전체 배열을 가져갈 수 있도록 함수 추가해야 할 것 같음
public:
vector<T>& GetAllItems() {
return items_;
}
랜덤 아이템 쓸 때 인벤토리의
GetAllItems()함수 부르면 인벤토리에 있는vector<Item>배열 넘겨짐. 거기서 랜덤으로 하나 뽑아서 효과 적용, 다 쓴 다음에는RemoveItem호출
<오늘 작업한 거 정리>
GetAllItems()를 만든 이유: 아이템 담당자가 "랜덤으로 아이템 하나만 뽑아 쓸게!"라고 할 때, 내 가방을 함부로 뒤지지 못하게 하면서도 배열의 내용물만 살짝 빌려주기 위해 만든 '소통 창구'입니다.
public:
vector<T>& GetAllItems() {
return items_;
}
void AddItem(T newItem) {
for (int i = 0; i < items_.size(); i++) {
if (items_[i].Name == newItem.Name) {
int SpaceLeft = items_[i].ItemMaxStack - items_[i].ItemCount;
if (SpaceLeft > 0) {
if (SpaceLeft >= newItem.ItemCount) {
items_[i].ItemCount += newItem.ItemCount;
cout << "-> " << newItem.Name << " " << newItem.ItemCount << "개를 기존 슬롯에 합쳤습니다.\n";
return;
}
else {
items_[i].ItemCount += SpaceLeft;
newItem.ItemCount -= SpaceLeft;
cout << "-> " << newItem.Name << " " << SpaceLeft << "개를 합치고 나머지는 새 슬롯에 넣습니다.\n";
}
}
}
}
if (items_.size() >= capacity_) {
ExpandCapacity();
}
items_.push_back(newItem);
cout << "-> " << newItem.Name << " " << newItem.ItemCount << "개를 새 슬롯에 획득했습니다!\n";
}
class InventoryManager {
private:
Inventory<Item> consumableBag_;
Inventory<Item> materialBag_;
-> 아이템을 습득했을 떄 If문으로 소비템인지 재료템인지 확인하려고 늘어뜨리는 코드보다 함수 분리해서 하는 게 더 깔끔할 것 같아서 분리해봄
public:
void AddConsumable(Item item) {
cout << "[소비 가방] ";
consumableBag_.AddItem(item);
}
void AddMaterial(Item item) {
cout << "[재료 가방] ";
materialBag_.AddItem(item);
}
};
모든 기능 구현 완료(오류 고치기 까지)
헤더, 소스 파일 나누기