코딩 테스트

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

우루쾅 2024. 2. 9. 12:07
728x90
반응형
SMALL

이틀동안 틈틈히 고민하면서 푼 문제....

 

어떠한 게임에 붕대 감기라는 기술을 통해 health 를 회복하는 게임

 

시전시간, 초당 회복량, 추가 회복량의 변수값을 통해 몬스터에게 공격을 받은 만큼의 피을 계속 회복하는 게임이다

 

각각의 변수값이 주어지고 공격과 공격 타이밍을 변수로 받으면 그 값에 따라 마지막 공격에 남은 피를 확인해야하는데

우선 저는 HashMap을 통해 공격받는 시점을 모두 체크하였습니다.

 

그 후 시간대를 for 문으로 돌려서 아래 3가지 조건으로 문제를 해결했습니다!

1. 공격받는 시점에 hp 감소

2. 피가 가득 차있으면 다음 시간으로 패스

3. 공격입은 후 피를 회복할 때 

 

처음에 문제를 해결하고 제출을 했을 때 테스트 14번에 막혔었다...

 

문제가 되는 부분을 확인해보니 회복 카운트를 할 때 조건을 아래 조건으로 잡아서 에러가 발생한 것...

hillCnt == bandage[0] || bandage[0] == 1

 

hillCnt 변수를 if 문 안에서 hillCnt++; 를 통해 계속 늘려줬었는데

그냥 조건을 if(++hillCnt == bandage[0]) 로 변경해서 문제를 해결했다!

 

 

 

 


정답

import java.util.*;

class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        int fullHealth = health;
        
        // 공격 숫자
        int chk = 0;
        // 회복 카운트
        int hillCnt = 0;
        
        Map<Integer, Integer> att = new HashMap<>();
        // 공격받는 시점 모두 체크
        for(int i=0; i<attacks.length; i++){
            att.put(attacks[i][0], attacks[i][1]);
        }
        
        for(int i=0; i<attacks[attacks.length-1][0]+1; i++){
            // 공격받는 시점에 hp 감소
            if(att.containsKey(i)){
                health -= attacks[chk][1];
                chk++;
                hillCnt = 0;
                
                // 피가 0 이하면 return -1
                if(health <= 0) return -1;
                continue;
            }
            
            // 풀피면 현재 시간 패스
            if(fullHealth == health) continue;
            
            // 공격을 입은 후 피를 회복할 때
            if(fullHealth != health){
                if(++hillCnt == bandage[0]){
                    health = health + bandage[1] + bandage[2];
                    hillCnt = 0;
                }else{
                    health += bandage[1];
                }
            }
            if(health > fullHealth) health = fullHealth;
        }
        
        return health;
    }
}

 

 

출처

프로그래머스 - https://school.programmers.co.kr/learn/courses/30/lessons/250137

728x90
반응형
LIST