알고리즘, 코딩테스트/알고리즘 풀이

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

jiyoon0000 2025. 3. 28. 14:07

Q. [PCCP 기출문제] 1번 / 붕대 감기

A.

class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        // bandage[t,x,y]
        // t: 연속으로 회복해야 하는 시간
        // x: 1초마다 회복되는 체력
        // y: t초 연속 회복 성공 시 회복되는 추가 체력
        int t = bandage[0];
        int x = bandage[1];
        int y = bandage[2];
        
        int currentHealth = health; // 시작할 때 캐릭터의 체력은 최대 체력
        int success = 0;            // 연속으로 회복에 성공한 초
        
        int attack = attacks.length; // 공격 수
        int countAttack = 0; // 현재까지 처리한 공격 인덱스
        int finalAttack = attacks[attack - 1][0]; // 마지막 공격 시간
        
        // 1초부터 마지막 공격 시각까지 1초단위로 진행
        for (int currentTime = 1; currentTime <= finalAttack; currentTime++) {
            
            // 현재 시각에 공격이 있는지 확인
            // countAttack < attack : 아직 처리할 공격이 남음
            // attacks[countAttack][0] == currentTime : 현재 시간이 다음 공격 시간과 동일
            if (countAttack < attack && attacks[countAttack][0] == currentTime) {
                // 공격이 발생하면, 공격 피해만큼 현재 체력 감소
                // 공격이 발생한 순간에는 회복 효과 없으니까 연속 성공 카운트 초기화
                // 공격 처리 이후 countAttack 증가시켜서 다음으로 넘김
                currentHealth -= attacks[countAttack][1];
                success = 0;
                countAttack++;
                
            } else { // 현재 공격이 없으면 회복 진행
                // 공격 없이 회복 성공했으니까 success 증가, 1초마다 x만큼 체력 회복
                success++;
                currentHealth += x;
                
                // 회복 후 체력이 최대 체력을 넘지 않아야 함
                if (currentHealth > health) {
                    currentHealth = health;
                }
                
                // 만약 연속 성공 시간이 t초가 되면 y만큼 회복 추가
                if (success == t) {
                    currentHealth += y;
                    if (currentHealth > health) {
                        currentHealth = health;
                    }
                    success = 0; // 추가 회복 끝나면 연속 성공 카운트 0으로 초기화
                }
            }
            
            // 체력이 0 이하가 되면 죽은 것이므로 -1 반환
            if (currentHealth <= 0) {
                return -1;
            }
        }
        
        // 모든 공격이 끝난 후 남은 체력 반환
        return currentHealth;
    }
}
반응형