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

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

어떤 게임에는 붕대 감기라는 기술이 있습니다.

붕대 감기는 t초 동안 붕대를 감으면서 1초마다 x만큼의 체력을 회복합니다. t초 연속으로 붕대를 감는 데 성공한다면 y만큼의 체력을 추가로 회복합니다. 게임 캐릭터에는 최대 체력이 존재해 현재 체력이 최대 체력보다 커지는 것은 불가능합니다.

기술을 쓰는 도중 몬스터에게 공격을 당하면 기술이 취소되고, 공격을 당하는 순간에는 체력을 회복할 수 없습니다. 몬스터에게 공격당해 기술이 취소당하거나 기술이 끝나면 그 즉시 붕대 감기를 다시 사용하며, 연속 성공 시간이 0으로 초기화됩니다.

몬스터의 공격을 받으면 정해진 피해량만큼 현재 체력이 줄어듭니다. 이때, 현재 체력이 0 이하가 되면 캐릭터가 죽으며 더 이상 체력을 회복할 수 없습니다.

당신은 붕대감기 기술의 정보, 캐릭터가 가진 최대 체력과 몬스터의 공격 패턴이 주어질 때 캐릭터가 끝까지 생존할 수 있는지 궁금합니다.

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


import java.util.*;

public class Main {
    public static void main(String[] args) {
//        int[] bandage = {5, 1, 5};
//        int health = 30;
//        int[][] attacks = {{2, 10}, {9, 15}, {10, 5}, {11, 5}};

//        int[] bandage = {3, 2, 7};
//        int health = 20;
//        int[][] attacks = {{1, 15}, {5, 16}, {8, 6}};


        int[] bandage = {4, 2, 7};
        int health = 20;
        int[][] attacks = {{1, 15}, {5, 16}, {8, 6}};

        var reuslt = solution(bandage, health, attacks);

        System.out.println(reuslt);
    }

    public static int solution(int[] bandage, int health, int[][] attacks) {
        int time = 0;
        int attacksIndex = 0;
        int stack = 0;
        int maxHealth = health;

        for (; ; ) {
            int[] currentAttack = attacks[attacksIndex];

            if (currentAttack[0] == time) {
                health -= currentAttack[1];
                System.out.println("time : " + time + "\t" + health);

                if (health < 1) {
                    return -1;
                }

                stack = 0;
                attacksIndex++;
                time++;

                if (attacksIndex == attacks.length) {
                    break;
                }
                continue;
            }

            health += bandage[1];
            stack += 1;

            if (stack == bandage[0]) {
                health += bandage[2];
                stack = 0;
            }

            if (health > maxHealth) {
                health = maxHealth;
            }

            System.out.println("time : " + time + "\t" + health);
            time++;
        }

        return health > 0 ? health : -1;
    }

}