2024-04-30

이재형·2024년 4월 30일
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 string solution(int[] foods) 
    {
        string answer = "";
        
        for(int i = 1; i < foods.Length; i++)
        {
            for(int j = 0; j < foods[i] / 2; j++)
            {
                answer += i.ToString();
                
            }
        }
        
        answer += "0";
        
        for(int i = foods.Length-1; i > 0; i--)
        {
            for(int j = 0; j < foods[i] / 2; j++)
            {
                answer += i.ToString();
                
            }
        }
        return answer;
    }
}

해석:

1. 한 글자씩 받아야하기 때문에 string으로 변수를 추가를 함
2. 해당 음식의 개수를 알기 위해 for문을 돌리고 개수 만큼 추가해야 하기 때문에 이중 for문을 추가 함
3. 개수같은 경우는 절반으로 줄이고 짝수여야 하므로 조건에 /2를 하여 반만 출력하게 함
4. 다음 반복을 끝내고 물인 "0"을 추가하고 다시 이중 역for문을 돌려 남은 절반을 출력하고 answer를 반환함


스파르타 TextDungeonGame 개발 2일차

구현 내용

1. 던전 (입장, 스테이지)

// 던전 입장 메뉴
public void DungeonMenu(Charactors _charactor)
{
    // 선택 시 로직
    choice = base.Choice(menu, true);
    switch(choice)
    {
        case 1:
            DungeonSelect(DungeonLv.쉬움, 10);
            //DungeonExplore(DungeonLv.쉬움, 10);
            break;
        case 2:
            DungeonSelect(DungeonLv.일반, 25);
            //DungeonExplore(DungeonLv.일반, 25);
            break;
        case 3:
            DungeonSelect(DungeonLv.어려움, 45);
            //DungeonExplore(DungeonLv.어려움, 45);
            break;
    }
}

// 던전 진행 선택
void DungeonSelect(DungeonLv level, int def)
{
    Console.WriteLine($"{level}던전에 들어오셨습니다.\n");
    Console.WriteLine("0. 던전 나가기");
    Console.WriteLine("1. 상태 보기");
    Console.WriteLine($"2. 전투 시작 (현재 진행: {floor}층)\n");

    // 선택 시 로직
    choice = base.Choice(menu, true);
    switch (choice)
    {
        case 0:
            Console.WriteLine("던전을 나갑니다.\n");
            break;
        case 1:
            // 상태 보기
            Status status = new Status();
            status.StatusMenu(charactor);
            DungeonSelect(level, def);
            break;
        case 2:
            // 던전 입장
            //DungeonInvite(floor, level);
            DungeonExplore(level, def);
            break;
    }
}

1. 해당 던전의 난이도, 방어력에 따른 매개변수를 받아서 DungeonSelect()를 실행함
2. 실행하면 해당 레벨에 따른 현재 입장할 던전난이도 출력 후 선택지를 나누게 함
3. 0은 메뉴로 가지고 1은 현재 자신 스탯을 확인하고 다시 현재 메서드로 재귀함수를 사용함
4. 2번의 경우에는 던전을 입장하는 메서드를 실행하는데 아직 전투가 미구현이라 전해 개발한 메서드를 사용해서 조건에 따른 클리어, HP감소, 보상 획득으로 처리함


2. 게임 (새로하기, 이어하기)

Console.WriteLine("1. 새로시작");
Console.WriteLine("2. 이어하기");
choice = base.Choice(3, false);
switch (choice)
{
    case 1:
        // 캐릭터 생성
        MakeCharactor();
        // 생성한 캐릭터 정보 저장
        dataManager.SaveCharactorToJson(charactor);
        break;

    case 2:
        // 캐릭터 정보 받아오기
        charactor = dataManager.LoadCharactorFromJson();
        // 캐릭터 정보가 없다면
        if (charactor == null)
        {
            Console.WriteLine("\n저장된 정보가 없어 새로 시작합니다.\n");
            MakeCharactor();
        }
        break;
}

1. 값을 받아서 1. 새로시작하기 하면 캐릭터 생성 메서드를 실행하고 해당 데이터를 그대로 저장 하게함
2. 이어하기 일 경우에는 저장했던 데이터를 불러와서 해당 정보로 할당을 함
3. 할당한 데이터가 있으면 저장을 하고 없다면(null) 저장된 정보가 없다고 하면서 캐릭터 생성 메서드를 실행 함


3. 퀘스트 조건 분할

// 퀘스트마다 클리어 조건을 각 클래스 별로 상속으로 설정함
public virtual void QuestClear(Charactors _charactor)
{

}

// 사냥하기
internal class Hunting : QuestInfo
{
    public Hunting()
	{
		monsterName = "미니언";
		currentCount = 0;
		maxCount = 0;
		questName = "마을을 위협하는 미니언 처치";
        questDescription = "이봐! 마을 근처에 미니언들이 너무 많아졌다고 생각하지 않나?\n마을 주민들의 안전을 위해서라도 저것들 수를 좀 줄여야 한다고!\n모험가인 자네가 좀 처치해주게!";
        questGoal = string.Format($"{monsterName} 5마리 처치 ({currentCount} / {maxCount})");
        rewardItem = new Armor(); // 방어구
        clearGold = 5;
    }

    public override void QuestClear(Charactors _charactor)
    {
        // 최대 횟수가 0이 아니고 currentCount가 maxCount가 아니라면
        if (maxCount <= currentCount)
        {
            clearCheak = true;
        }
    }
}

// 장비를 장착하기
internal class EquipItem : QuestInfo
{
	public EquipItem()
	{
        questName = "장비를 장착해보자";
		questDescription = "자네 신참 모험가가 아닌가? \n모험을 떠나기전에 장비를 구매해서 한 번 장착해보겠는가?";
        questGoal = string.Format($"무기와 방어구를 모두 장착하기");
        clearGold = 10;
	}

    public override void QuestClear(Charactors _charactor)
    {
        if (_charactor.Weapon != null && _charactor.Armor != null)
        {
            if (_charactor.Weapon.IsEquiped && _charactor.Armor.IsEquiped)
            {
                clearCheak = true;
            }
        }
    }
}

// 더 강해지기
internal class PowerUp : QuestInfo
{
	public PowerUp()
	{
        atk = 13;
        def = 23;
        questName = "더욱 더 강해지기";
        questDescription = "당신 아직 높은 던전에 가기에는 미숙한 거 같군";
        questGoal = string.Format($"공격력 {atk}이상 / 방어력 {def}이상 ");
        clearGold = 30;
    }

    public override void QuestClear(Charactors _charactor)
    {
        if (_charactor.Attack + _charactor.PlusAttack >= def && _charactor.Defend + _charactor.PlusDefend >= def)
        {
            clearCheak = true;
        }
    }
}

1. 상속 받을 클래스에 virtual로 통합할 메서드를 생성
2. 각 퀘스트 클래스별로 QuestInfo를 상속받고 override를 이용해서 메서드 생성
3. 각 메서드에 퀘스트를 클리어할 조건을 생성하고 달성 시 퀘스트완료 변수를 true로 변경


배운 내용

1. 상속을 이용할 때 virtual에 코드가 있어야 한다는 고정관념은 버려야 함( 내용없이 override를 하기 위해서 사용함 )

정리

해결 못한 문제

1. 다른 팀원들의 작업(전투)을 끝내고 진행해야 가능해서 처리하지 못함

문제점

1. 없음

profile
한국사람

0개의 댓글