알고리즘/프로그래머스 Level1

[PCCP 기출문제] 붕대 감기

류창 2024. 1. 21. 23:34
반응형

 

 

문제 분석 

 

붕대감기 문제 요약 

 

1. 플레이어는 hp가 최대치가 아니면 붕대감기 스킬을 시전한다.

 

2. 붕대는  1초마다 x만큼 회복하며,   특정한 t초 연속으로 붕대를 감았다면 y만큼 보너스로 회복한다.

 

3. 공격을 받으면 붕대감기는 취소댄다.

 

4. 최종적으로 현재 체력을 반환한다. hp가 0이 내려가면  -1를 반환한다

 

 

 

문제 풀이 

 

전형적인 구현 문제이다.

 

정리해놓은 순서대로 하나씩 구현을 해나가면 된다.

 

여기서 1초마다 hp를 체크해 나갈것인지,   공격을 받는 구간만 계산하는지  두가지 전략이 있다.

 

하지만, 1초마다 체크해 나가는 전략은  효율성이 매우 떨어지니, 

조금 복잡하더라도  공격을 받는 구간에 hp잔여량을 계산하기로 하자.

 

우선 hp가 최대치일 경우만 붕대감기를 적용시킨다.

 

그리고,  공격을 받는 시간과,  현재 시간의  시간차를 구한다. (gap)

 

그 시간차가,  붕대 연속감기 보너스보다 작다면,  통상적으로 회복한다.

 

시간차가 붕대 연속감기 보너스 이상이라면,  보너스 hp회복도 계산해준다.

 

붕대감기가 완료됬다면,  변수들을 새롭게 초기화 시키면 끝이다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        int answer = 0;
        
        int hp=health;
        int time =0;
        
        for(int[] attack : attacks){
            
            if(hp!=health){
              int gap =attack[0]-time-1;
              
              if(gap>=bandage[0]){
                 hp+=gap*bandage[1]+(gap/bandage[0])*bandage[2];       
              }else{
                  hp+=gap*bandage[1];
              }
                
                if(hp>=health){
                     hp=health;
                 }
            }
            
            time= attack[0];
            hp -= attack[1];
 
            if(hp<=0){
                return -1;
            }
            
        }
        
        
        
        return hp;
    }
}
cs
반응형