관리 메뉴

The Nirsa Way

[프로그래머스 Lv1] PCCP 기출문제 1번 - 붕대감기(테스트14) 본문

코딩 테스트/프로그래머스

[프로그래머스 Lv1] PCCP 기출문제 1번 - 붕대감기(테스트14)

KoreaNirsa 2023. 12. 2. 11:24
반응형
※ 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/250137

 

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

우선 전체적인 로직은 아래와 같은데, 테스트 케이스 14에서 실패가 한 개 발생했습니다.

class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        int time = 0; // 현재 시간
        int recoveryTime = 0; // 연속 회복 시간
        int maxHealth = health;
        int attackCount = 0; // 공격 시간 카운트 값
        int attackLength = 0; // 마지막 공격 확인용
        
        while(true) {
            if(attacks.length == attackLength) { //마지막 공격 확인
                return health;
            }
            
            if(time == attacks[attackCount][0]) { // 공격 시간일 때
                health -= attacks[attackCount][1]; // 현재체력 - 피해량
                if(health <= 0) {
                    return -1;
                }
                attackCount++; 
                attackLength++;  // 공격 길이 증가
                recoveryTime = 0; // 연속 회복 시간 초기화
            } else {  // 공격 시간이 아닐 때
            	recoveryTime++; // 연속 회복 시간 증가
                health += bandage[1]; // 체력 회복

                if (recoveryTime == bandage[0]) { // t초 연속 성공 시 추가 회복
                    health += bandage[2];
                }

                if(health > maxHealth) { // 현재 체력이 최대 체력보다 높을 경우 최대 체력으로 변경
                    health = maxHealth;
                }
            }
            time++; // 현재 시간 증가
        }
    }
}

 

 

테스트14 실패 이유

확인해가며 테스트하며 찾았는데, 테스트 14에서는 `시전 시간`이 2번 발생하는것으로 추측됩니다. 현재 코드에서는 `시전 시간`동안 회복을 성공하는 최초 1회에 한해서만 추가 회복을 할 수 있습니다.

1. 시전 시간 3, 공격 시간 7 일 경우 회복을 3번 성공할 경우 추가 회복
2. 시전 시간 6, 공격 시간 7 일 경우 추가 회복 불가
    → '시전에 성공한 시간 == 시전 시간' 으로 계산하기 때문에 2번의 경우 조건식이 성립되지 않음
    → 조건식이 6 == 3이 될 경우 false이기 때문

 

테스트 14의 경우 위와 같은 케이스로 추가 회복이 2번 연속 발생하는것으로 보이기 때문에 추가 회복이 성공할 경우 연속회복시간을 0으로 초기화 하여 테스트14를 통과했습니다. 아래 코드에서는 recoveryTime 변수를 0으로 초기화 했지만, recoveryTime % bandage[0] == 0 으로 배수를 확인하고 초기화를 생략해도 통과되었습니다.

if (recoveryTime == bandage[0]) {
    health += bandage[2];
    recoveryTime = 0;  // 회복 시간 초기화
}
반응형