ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알고리즘] 프로그래머스 1단계 - 붕대감기
    Algorithm 2024. 4. 29. 15:29

    프로그래머스 문제 링크

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

     

    문제 설명

    이 문제는 붕대배열과, 최대 체력, 공격 배열이 주어진다.

    bandage라는 배열 [ 5, 1, 5 ]에 0번째는 5초라는 시간을 의미하고 이 5초를 다 채운경우 2번째 인자인 5를 추가 회복 점수를 받을 수 있다.

    1번 인자의 숫자 1은 기본 1초당 회복 점수를 의미한다. 회복 도중 공격을 당하면 다시 1초부터 5초까지 기다려야 추가 회복 점수를 받을 수 있다.

    health의 경우 시작하는 체력 점수이면서 최대가질수 있는 체력점수이고 이 이상 회복할 수 없다.

    attacks 배열은 이중배열로 몬스터로 부터 공격을 당한 경우 받는 데미지로 [2, 10] 이 첫번째 이중 배열의 숫자 배열인 경우 시간이 2초일때 10 데미지를 받는다는 의미이다.

     

    예시

    bandage

    [5, 1, 5]

    health

    30

     

    attacks

    [[2, 10], [9, 15], [10, 5], [11, 5]] 

     

    result
    5

     

    public class Main {
    
        public static void main(String[] args) {
    
            System.out.println(solution(new int[]{5, 1, 5}, 30, new int[][]{{2, 10}, {9, 15}, {10, 5}, {11, 5}}));
        }
    
        static int solution(int[] bandage, int health, int[][] attacks) {
    
            // 공격 배열 인덱스
            int attackIdx = 0;
    
            // 회복 누적 인덱스
            int healthIdx = 1;
    
            // 보너스 받는 주기
            int time = bandage[0];
    
            // 기본 회복 점수
            int plusHealth = bandage[1];
    
            // 추가 회복 점수
            int bonusHealth = bandage[2];
    
            // 마지막 공격 인덱스
            int lastIdx = attacks[attacks.length - 1][0];
    
            // 현재 남은 체력
            int curHealth = health;
    
            for (int i = 1; i <= lastIdx; i++) {
    
                // 공격 받은 경우
                if (i == attacks[attackIdx][0]) {
                    curHealth -= attacks[attackIdx][1];
                    attackIdx++;
                    healthIdx = 0;
    
                // 회복 시간을 모두 채운 경우 추가 점수
                } else if (healthIdx == time) {
                    curHealth += bonusHealth + plusHealth;
                    healthIdx = 0;
                } else {
                    curHealth += plusHealth;
                }
    
                // 체력이 0이하인 경우 -1 리턴
                if (curHealth <= 0) {
                    return -1;
                }
    
                // 체력의 최대치는 넘을 수 없다.
                if (curHealth > health) {
                    curHealth = health;
                }
    
                healthIdx++;
            }
    
            return curHealth;
        }
    }

     

    풀고 다른분들의 풀이를 봤는데 마지막 배열의 시간초를 알필요가 없이 바로 foreach문을 사용하면서 이전 배열의 공격당한 시간 초를 현재 공격한 시간을 빼서 회복 점수를 계산하는 방식을 봤다. 그 코드가 간결하고 이해하기 쉬웠다. 프로그래머스는 다양한 풀이 방식이 공개 되서 배울점이 많다.

    댓글

Designed by Tistory.