설명: 3가지의 음식이 준비되어 있으며, 칼로리가 적은 순서대로 1번 음식을 3개, 2번 음식을 4개, 3번 음식을 6개 준비했으며, 물을 편의상 0번 음식이라고 칭한다면, 두 선수는 1번 음식 1개, 2번 음식 2개, 3번 음식 3개씩을 먹게 되므로 음식의 배치는 "1223330333221"이 됩니다. 따라서 1번 음식 1개는 대회에 사용하지 못합니다.
using System;
public class Solution {
public int solution(int a, int b, int n) {
int answer = 0;
while(a <= n)
{
answer += n / a * b;
n = b * (n / a) + (n % a);
}
return answer;
}
}
1. a = 전달하는 콜라병 수, b = 전달 후 받는 콜라병 수, n = 갖고 있는 콜라병 수
2. 전달할 콜라병 수가 갖고 있는 콜라병 수보다 적을 때까지 돌려야하므로 while(무한)을 사용
3. 무한문마다 현재 콜라 개수를 전달할 콜라병의 개수만큼 나눠 몫만큼 anwer에 더함
4. 후 그만큼 n의 값을 변경하고 나머지가 있으면 같이 더 해줌
5. 반복하고 전달할 콜라병의 수가 갖고 있는 콜라병 수보다 많아지면 반복문을 끝내고 answer를 반환함
// 던전 레벨에 따라 몬스터 생성
Monster[] CreateMonsters(DungeonLv dungeonLevel)
{
int monsterCount; // 몬스터 개체 수
int monsterAttack = 0; // 층에 따른 몬스터 추가 공격력
int monsterHp = 0; // 층에 따른 몬스터 추가 체력
Monster[] MonstersLevel; // 난이도에 따른 몬스터 정보
switch (dungeonLevel)
{
case DungeonLv.쉬움:
monsterCount = random.Next(1, 3);
MonstersLevel = new Monster[]
{
new Monster("미니언", 15, 20, 3),
new Monster("대포미니언", 25, 20,4),
new Monster("공허충", 10, 30, 6)
};
break;
case DungeonLv.일반:
monsterCount = random.Next(1, 4);
monsterAttack = random.Next(0, 3);
monsterHp = random.Next(0, 5);
MonstersLevel = new Monster[]
{
new Monster("미니언", 15, 25 + monsterHp, 5 + monsterAttack),
new Monster("대포미니언", 25, 30 + monsterHp,6 + monsterAttack),
new Monster("공허충", 10, 50 + monsterHp, 8 + monsterAttack)
};
break;
case DungeonLv.어려움:
monsterCount = random.Next(2, 4);
monsterAttack = random.Next(3, 7);
monsterHp = random.Next(5, 15);
MonstersLevel = new Monster[]
{
new Monster("미니언", 15, 40 + monsterHp, 8 + monsterAttack),
new Monster("대포미니언", 25, 60 + monsterHp, 9 + monsterAttack),
new Monster("공허충", 10, 60 + monsterHp, 10 + monsterAttack)
};
break;
default:
throw new ArgumentException("올바르지 않은 던전 레벨입니다.");
}
// 해당 몬스터 정보를 토대로 monsterCount만큼 랜덤으로 스폰
Monster[] randomMonster = new Monster[monsterCount];
for(int i = 0; i < monsterCount; i++)
{
randomMonster[i] = MonstersLevel[random.Next(0, 3)];
}
return randomMonster;
}
1. 난이도에 따라서 변경할 각 몬스터 정보(공격력, 체력, 개체 수)를 변수로 선언
2. switch문으로 각 난이도 별로 변수들의 값을 랜덤으로 초기화
3. 변경한 값을 해당 MonsterLevel에 몬스터들의 정보를 입력하여 저장
4. switch문을 나와서 새로운 몬스터 정보(randomMonster)를 개체 수의 크기만큼 생성 함
5. 몬스터들의 정보를 저장한 변수에서 랜덤 개체를 개체 수 만큼 반복하여 새로운 배열에 저장
6. 개체 수 만큼 랜덤으로 저장한 몬스터들의 정보를 반환 함
else
{
//공략 성공
Console.WriteLine("던전 클리어");
Console.WriteLine("축하합니다!!");
Console.WriteLine($"던전 : {_lv} 을 클리어 했습니다.\n");
floor++; // 클리어 후 층 증가
}
Console.WriteLine("\n0. 던전 나가기");
Console.WriteLine("1. 던전 로비\n");
choice = base.Choice(1, true);
if (choice == 1)
{
if (floor == 6)
{
Console.WriteLine("꼭대기에 도착하여 던전에서 나갑니다.\n");
}
else
{
// 던전 로비로 이동
DungeonSelect(_lv, _recommandedDef);
}
}
1. 던전의 층을 클리어하면 던전 로비, 던전 나가기를 만들어 더 진행할지 나갈지 정하게 함
2. 던전 로비를 선택한 경우에는 던전의 로비로 나간다.
3. 하지만 적을 처치 시(5층에서 모든 적을 처치하면 바로 1층이 올라가므로) 해당 던전의 층이 6층일 때 로비로 가지 않고 "꼭대기에 도착하여 던전에서 나갑니다."라는 텍스트 출력과 함께 던전을 나가게 된다.
1. 처치하는 퀘스트의 진행: 특정 몬스터를 잡아야하는 퀘스트에서 해당 몬스터를 잡았을 때 퀘스트에 잡은 횟수가 들어가게 해야 함
1. 메서드안에서 Switch문을 사용할 때 각 case에서 break를 사용을 하는데 break 대신 return으로 나가면 오류가 생기지 않아 반환타입이 있는 메서드일 경우
2. json을 사용할 때 jsonConvert.DeserializeObject<타입>(해당Josn파일)에서 해당 타입으로 json파일을 변환할 때 생성자로 만들어지기 때문에 해당 타입의 생성자에 메서드가 있으면 실행이 되므로 사용할 때 주의 해야함
3. 중단점을 걸어서 디버깅을 할 때 조사식만을 보고 해결을 했는데 프로시저 단위로 실행하면서 디테일하게 코드를 확인하는 방법으로 문제를 찾는 것도 좋은 방법이라고 알게 됨
1. 퀘스트에서 특정 몬스터를 잡아야 완료를 하는 퀘스트 미구현 (해당 구현 방법은 정리했으니 내일 구현하면 됨)
2. 전반적인 Text게임을 따라가지만 각자 만든 코드를 연결하는 것이 많으므로 버그가 있는지 찾아야함
1. 발생: 깃허브로 프로젝트 공유를 할 때 머지 순서로 인하여 코드의 병합에 문제가 생겼음
1. 해결: revert change commit을 해도 해결이 되지않아 Create branch from commit기능을 사용하여 History에 이상이 없던 부분을 새로운 Branch로 만들어 사용하여 해결함