붕대 감기

하이솝·2026년 3월 9일

2026.03.09

소요 시간: 39분

나의 정답

class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        int t = 0; // 연속으로 공격 성공한 시간
        int healthLimit = health;
        int tLimit = bandage[0]; // 최대 공격 시간
        int healPerSec = bandage[1]; // 초당 회복 시간
        int additionalHeal = bandage[2]; // 추가 회복 시간
        boolean isAttacked = false; // 공격 여부 판단
        for (int sec = 1; sec <= attacks[attacks.length - 1][0]; sec++) { // 공격 최대 시간 만큼 반복
            isAttacked = false;    
            for (int i = 0; i < attacks.length; i++) {
                if (sec == attacks[i][0]) {
                    isAttacked = true; // 공격받음 표시
                    t = 0; // 연속 공격 횟수 초기화
                    health -= attacks[i][1]; // 공격만큼 현재 체력 하락
                    if (health <= 0) { // 체력이 0 이하로 떨어졌을 때
                        return -1; // 현재 체력 반환
                    }
                    break;
                }
            }
            if (isAttacked == false) { // 공격 받지 않았을 때
                t++; // 연속 공격 성공 횟수 증가
                if (t >= tLimit) { // 연속 공격 횟수가 최대치일 때
                    t = 0; // 연속 공격 횟수 초기화
                    health += additionalHeal; // 추가 체력만큼 체력 회복
                }
                health += healPerSec; // 체력 회복
                if (health > healthLimit) { // 최대 체력을 초과할 때
                    health = healthLimit; // 최대 체력과 같게 조정
                }
            }
        }       
        return health;
    }
}

AI 정답
(freeTime * healPerSec) + (freeTime / bandageTime * bonusHeal);
int freeTime = attackTime - lastAttackTime - 1;
위의 두 코드가 전체 코드 양을 줄여주고 효율적으로 바꿔준 핵심 코드임
코드로 구현하는 것은 그렇게 어렵지 않으나, 이와 같은 수학적인 사고를 하는 것에 상당한 연습이 필요할 것으로 생각함

class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        int maxHealth = health;
        int lastAttackTime = 0;       
        int bandageTime = bandage[0];
        int healPerSec = bandage[1];
        int bonusHeal = bandage[2];
        for (int[] attack : attacks) {
            int attackTime = attack[0];
            int damage = attack[1];
            // 1. 직전 공격과 현재 공격 사이의 자유 시간 계산
            int freeTime = attackTime - lastAttackTime - 1;
            if (freeTime > 0) {
                // 총 회복량 = (초당 회복량 * 자유 시간) + (보너스 회복 횟수 * 보너스 수치)
                int totalHeal = (freeTime * healPerSec) + (freeTime / bandageTime * bonusHeal);
                health = Math.min(maxHealth, health + totalHeal);
            }
            // 2. 공격 처리
            health -= damage;
            if (health <= 0) return -1;
            // 3. 마지막 공격 시간 갱신
            lastAttackTime = attackTime;
        }
        return health;
    }
}

0개의 댓글