관리 메뉴

기억을 위한 기록들

[프로그래머스 Lv 1] [PCCP 기출문제] 1번/ 붕대감기 본문

Coding Test - cpp/Etc

[프로그래머스 Lv 1] [PCCP 기출문제] 1번/ 붕대감기

에드윈H 2024. 3. 24. 15:17

https://school.programmers.co.kr/learn/courses/30/lessons/250137

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

프로그래머스에서 PCCP 라는게 생긴걸 보고 관심생겨서 한번 목표로 삼고 연습해봐야겠다.

 

 

 

문제는 "붕대감기"라는 체력회복 스킬이 있고 해당 스킬은 1초당 N만큼의 체력을 회복하고, 시전시간을 다 채운다면 추가적인 체력회복을 하는 것인데, 그전에 특정 시간에 몬스터의 공격에 맞으면 붕대감기 스킬이 취소 된다. 그리고 체력이 깎여서 체력이 0 이하가 되면 -1을 반환하는 문제이다.

 

내 풀이 :

#include <string>
#include <vector>

using namespace std;

void AddHeal( int& CurrentHeal,const int& AddtiveHeal,const int& MaxHeal)
{
    if(CurrentHeal+AddtiveHeal<=MaxHeal)
    {               
        CurrentHeal += AddtiveHeal;                     
    }else
    {
        CurrentHeal = MaxHeal;
    }
}


int solution(vector<int> bandage, int health, vector<vector<int>> attacks) {   
    const int MaxHealth = health;
    
    const int HealTime = bandage[0];
    const int HealMount = bandage[1];
    const int BonusHeal = bandage[2];
    
    int AttackIdx = 0;
    int AddtiveHealCnt = 0;
    
    for(int i=0;i<=attacks[attacks.size()-1][0];i++)
    {
        const int AttackTime = attacks[AttackIdx][0];
        if(i==AttackTime)
        {
            //공격 당함
            const int AttackDamage = attacks[AttackIdx++][1];
            health-=AttackDamage;           
            AddtiveHealCnt = 0; //추가회복량 적용 취소
        }else
        {
            //힐 성공
            AddtiveHealCnt++;
            AddHeal(health,HealMount,MaxHealth);
            
        }
        
        if(health<=0)
        {
            //사망시 return
            return -1;
        }

        if(AddtiveHealCnt==HealTime)
        {
            //추가 회복량 적용 성공
            AddtiveHealCnt  = 0;
            AddHeal(health,BonusHeal,MaxHealth);
        }       
    }
    
    return health;
}

 

 

다른코드 보고 배운점 :

체력추가 관련된 AddHeal이라는 함수를 따로 빼서 썼는데, 다른분들의 코드 보고 아래와 수정하니  훨씬 직관적이고, 간결해졌다.

void AddHeal( int& CurrentHeal,const int& AddtiveHeal,const int& MaxHeal)
{
    CurrentHeal = min(CurrentHeal+AddtiveHeal,MaxHeal);
}