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; } }