알고리즘 문제/프로그래머스

프로그래머스 붕대 감기 [Lv. 1] (C++)

우대비 2024. 10. 25. 20:30
반응형
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

어떤 게임에는 붕대 감기라는 기술이 있습니다. 기술을 시전하면 매 초마다 체력이 회복되며, 시전 시간을 다 채울 경우 추가로 체력이 회복됩니다. 스킬의 시전 시간, 초당 회복량, 추가 회복량, 그리고 캐릭터의 최대 체력, 몬스터의 공격을 받는 시간과 피해량을 입력 받을 때, 모든 공격이 끝난 직후 남은 체력을 반환 해주세요.

 

 

풀이 방법

0초 부터, 공격이 끝나는 시간 까지 매 초 계산해 주는 방식으로 풀었습니다.

현재 체력과, 연속적으로 회복한 시간, 현재 시간, attacks 배열의 index를 가르키는 변수를 만들고

index가 attacks 배열의 마지막을 가르킬 때 까지 while문을 반복 했습니다.

int hp = health;
int healCnt = 0;

int time = 0;
int idx = 0;
while(idx < attacks.size())
...
...

 

 

이후 공격을 받는 시간이 됐다면 체력을 감소시키고, 체력이 0 아래로 떨어지면 -1을 바로 반환하도록 했습니다.

if (attacks[idx][0] == time)
{
    hp -= attacks[idx++][1];
    healCnt = 0;
    if (hp <= 0)
        return -1;
}

 

 

그렇지 않으면 체력을 회복하고 시전 시간을 다 채웠다면 추가 회복하는 로직을 만들었습니다.

else
{
    hp += bandage[1];
    if (++healCnt == bandage[0])
    {
        healCnt = 0;
        hp += bandage[2];
    }
    hp = min(hp, health);
}

 

이후 마지막에 남은 체력을 반환하여 마무리 했습니다.

 

 

정답 코드

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int solution(vector<int> bandage, int health, vector<vector<int>> attacks) {

    int hp = health;
    int healCnt = 0;
    
    int time = 0;
    int idx = 0;
    while(idx < attacks.size())
    {
        // 공격 받을 시간이 됐다면 ?
        if (attacks[idx][0] == time)
        {
            hp -= attacks[idx++][1];
            healCnt = 0;
            if (hp <= 0)
                return -1;
        }
        else
        {
            hp += bandage[1];
            if (++healCnt == bandage[0])
            {
                healCnt = 0;
                hp += bandage[2];
            }
            hp = min(hp, health);
        }
        
      //  cout << "TIME : " << time << " IDX : " << idx << " HP : " << hp <<"\n";
        time++;
    }
    
    return hp;
}
반응형
LIST