[프로그래머스] 붕대감기 - 250137(Java)

개발하는 파랑이·2024년 3월 13일

프로그래머스

목록 보기
1/5

<문제>

  • https://school.programmers.co.kr/learn/courses/30/lessons/250137
  • t초 동안 붕대를 감으면서 1초마다 x만큼의 체력 회복(t초 연속 붕대 감기에 성공시 y만큼 체력을 추가로 회복)
  • 게임 캐릭터에는 최대 체력이 존재 현재 체력 > 최대 체력 불가능
  • 기술 사용시 몬스터 공격 당하면 기술 취소, 당하는 순간 체력 회복X / 공격이 끝나면 그 즉시 붕대감기 시작(연속 성공시간 0으로 초기화)
  • 몬스터 공격 받으면 피해량 만큼 현재 체력이 줄고 0이 되면 캐릭터가 죽어 더이상 회복 불가능
  • 붕대감기 기술의 정보, 캐릭터가 가진 최대 체력과 몬스터의 공격패턴이 주어질 때 끝까지 생존 가능?

<입력>

  • 1차원 정수 배열(bandage) - 기술의 시전시간, 1초당 회복량, 추가회복량(t,x,y)
  • 정수 health - 최대 체력
  • 2차원 정수 배열(attacks) - 몬스터 공격 시간과 피해량(몇초 동안이 아니고 몇초에 얼마를 공격)

<출력>

  • 모든 공격이 끝난 후 남은 체력을 return, 0이하라 죽으면 -1 return

    bandagehealthattacksresult
    [5, 1, 5]30[[2, 10], [9, 15], [10, 5], [11, 5]]5
    [3, 2, 7]20[[1, 15], [5, 16], [8, 6]]-1
    [4, 2, 7]20[[1, 15], [5, 16], [8, 6]]-1
    [1, 1, 1]5[[1, 2], [3, 2]]3

⇒ 첫번째 예제:

  • 캐릭터(5초 동안 붕대감으면서 1초마다 1씩 회복, 이때 5초 연속 감기 성공 시 5만큼 추가회복)
  • 몬스터 공격 시작 시 기술 취소, 끝나면 즉시 붕대감기(2초에 10공격, 9초에 15공격 etc)
  • 최대 체력은 30

<풀이>

  1. 마지막 공격 시간까지 반복
  2. 공격이 아닐 때 공격일 때 체크
  3. 연속 성공되는 순서에 (초당 회복량 + 추가회복량) 추가 후 연속 성공 0으로 리셋
  4. 만약 중간에라도 최대 체력이면 회복하지 않는다. but, 연속 성공횟수는 늘려야 한다.
  5. 공격 끝나면 체력 return (중간에 체력이 0이하면 반복 중간 바로 -1 return)

<전체 코드>

class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        int t = bandage[0]; //시간
        int x = bandage[1]; //1초당 체력 회복량
        int y = bandage[2]; // 추가 회복량
        int life = health; //최대 체력
        int count = 0; //연속성공 횟수
        int attackIndex = 0; //인덱스(몬스터가 공격하는 시간)
        for(int i=1; i<=attacks[attacks.length-1][0]; i++) {
            if(i != attacks[attackIndex][0]) { //몬스터가 공격하지 않을 때
                life += x;
                count++;
                if(count == t) {
                    life += y;
                    count = 0;
                }
                if(life>health) 
                    life = health;
            }
            else {
                count = 0;
                life -= attacks[attackIndex][1];
                attackIndex++;
                if(life<=0)
                    return -1;
            }
        }
        return life;
    }
}
profile
이것저것 개발자

0개의 댓글