2024-05-01

이재형·2024년 5월 1일
0
post-thumbnail

알고리즘(프로그래머스)

Lv.1 콜라 문제

설명: 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를 반환함


스파르타 TextDungeonGame 개발 3일차

구현 내용

1. 난이도에 따른 몬스터의 정보(공격력, 체력, 개체 수)

// 던전 레벨에 따라 몬스터 생성
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. 개체 수 만큼 랜덤으로 저장한 몬스터들의 정보를 반환 함


2. 전투 이후 진행과정

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로 만들어 사용하여 해결함

profile
한국사람

0개의 댓글