코딩테스트/PCCP

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

haleylog 2025. 2. 17. 14:40

요구사항

몬스터는 캐릭터를 정해진 시간에 정해진 피해량으로 공격하고

캐릭터는 붕대 감기 기술을 통해 일정 시간 동안 체력을 회복하며 연속 성공 시 추가 회복 한다.

몬스터의 공격이 끝난 시점의 남은 체력 구하기

(체력이 0이하인 경우 -1 return)

 

 

입력 값

int[] bandage 붕대감기 기술 정보 [시전 시간, 초당 회복량, 추가 회복량]
int health 캐릭터의 최대 체력 (=시작 체력)
int[][] attacks 몬스터의 공격 정보 배열 [[공격 시간, 피해량], [공격 시간, 피해량] .. ]

 

 

풀이

1. 마지막 공격 시점까지 초 단위로 loop 블럭 

 

2. 현재 loop 시점이 공격 시점인 경우 몬스터 공격 처리

   -> 공격량만큼 체력 차감

   -> 붕대 감기 연속 시전 시간 초기화

   -> 체력이 0 이하인 경우 return -1 (더 이상 loop 불필요)

 

3. 현재 loop 시점이 공격 시점이 아닌 경우 붕대감기 처리

   -> 초당 회복량 만큼 체력 충전

   -> 붕대 감기 연속 시전 시간 추가

   -> 연속 붕대 감기 성공 시 추가 회복량 만큼 체력 충전 및 붕대 감기 연속 시전 시간 초기화

   -> 체력 충전 처리 후 최대 체력보다 초과하는 경우 남은 체력 = 최대 체력 으로 변경

 

4. 남은 체력 return

 

728x90

 

Java 코드

class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        int answer = 0;
        
        int remainHealth = health;
        int attackTime   = 0;
        int healSec      = 0;
        
        for(int sec=1; sec <= attacks[attacks.length - 1][0]; sec++) {
            if(sec == attacks[attackTime][0]) {
                remainHealth -= attacks[attackTime][1];
                healSec      = 0;
                
                // 죽었으면 return
                if(remainHealth <= 0) return -1;
                
                // 마지막 공격 시간이 아니면, 다음 공격회차로 세팅
                if(attackTime < attacks.length) attackTime++;
                
                continue;
            } 
            
            remainHealth += bandage[1];
            healSec++;

            // 연속 피채우기 성공이면 추가 회복
            if(healSec == bandage[0]) {
                remainHealth += bandage[2];
                healSec      = 0;
            } 

            // 최대 체력 넘으면 최대 체력으로 세팅
            if(remainHealth > health) remainHealth = health;
        }
        
        answer = remainHealth;
        return answer;
    }
}

 

 

 

문제 출처

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

728x90
반응형