평범한 연구소

[프로그래머스] 붕대 감기 (JAVA) 본문

JAVA/알고리즘 공부

[프로그래머스] 붕대 감기 (JAVA)

soyeonisgood 2024. 9. 6. 15:45

문제는 여기 !  https://school.programmers.co.kr/learn/courses/30/lessons/250137

 

attacks 2차원 배열을 해시맵에 담아서 꺼내쓰는 방향으로 리팩토링을 해봐야겠다.

 

    private final int MAXIMUM_HEALTH = 30;
    private boolean isAttacked = false;
    private int continuousSuccess = 0;

    public int solution(int[] bandage, int health, int[][] attacks) {
        int attackCount = attacks[attacks.length-1][0]; // attack 2차배열 마지막요소의 y값
        for (int i=1; i<=attackCount; i++) {
            health -= getAttack(i, attacks);
            health += getHeal(health, bandage);
            if(isDead(health)) return -1;
        }
        return health;
    }

    private int getAttack(int count, int[][] attacks) {
        int targetAttack = 0;
        for (int i=0; i<attacks.length; i++) {
            if(attacks[i][0] == count) targetAttack =attacks[i][1];
        }

        if (targetAttack > 0) attack();
        else nonAttack();
        return targetAttack;
    }

    private int getHeal(int currnetHealth, int[] bandage) {
        if(isAttacked) return 0;
        
        int bonusCount = bandage[0];
        int healToPer = bandage[1];
        int healThenContinuous = bandage[2];
        int result;

        if(continuousSuccess>=bonusCount) result = healToPer + healThenContinuous;
        else result = healToPer;

        if(currnetHealth >= MAXIMUM_HEALTH) {
            return 0;
        } else {
            int total = currnetHealth+result;
            return total>=30 ? result-(total-30) : result;
        }
    }
    
    private boolean isDead(int health) {
        return health<=0;
    }

    private void nonAttack() {
        isAttacked = false;
        continuousSuccess++;
    }

    private void attack() {
        isAttacked = true;
        continuousSuccess = 0;
    }