[프로그래머스 / Java] [PCCP 기출문제] 1번 / 붕대 감기

clean·2024년 1월 18일
0
post-thumbnail

문제 정보

난이도: lev.1
예상 태그: 구현
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/250137

문제 푸는 데 걸린 시간: 32m

풀이

  1. 처음에 hp가 가득 찬 상태로 시작할 것이기 때문에, 0초부터 첫 공격까지 텀이 있다고 해도 그 때의 붕대감기는 의미가 없습니다.
  2. 따라서 그냥 attack 배열을 인덱스 0~(attack.length-2)까지 돕니다. attack의 마지막 원소는 for문을 나가서 나중에 따로 처리해야합니다.
  3. i번째 attack의 데미지를 입힙니다.
  4. 만약 hp <= 0이면 -1을 리턴합니다.
  5. 다음 공격까지의 텀을 계산합니다. 여기서 중요한 것은, 공격하는 시점에는 붕대감기를 할 수 없으므로 [term = (다음공격) - (지금공격) - 1]이 됩니다.
  6. 붕대감기를 합니다. 식은 다음과 같습니다.
    hp += (term)x + (term/bandage[0])y
  7. hp의 값이 health보다 크다면 hp = health로 변경합니다.
  8. for문을 빠져나와 attack 배열의 마지막 원소를 처리하며 마지막 데미지를 입힙니다.
  9. hp를 검사하여 0이하면 -1을, 아니라면 hp를 리턴합니다.
class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        // int answer = 0;
        int hp = health;
        int bandage_time = bandage[0];
        
        for(int i=0; i<attacks.length-1; ++i) {
            int time = attacks[i][0], dem = attacks[i][1];
            
            // 데미지 입히기
            hp -= dem;
            
            // 체력 확인
            if(hp <= 0) return -1;
            
            int term = attacks[i+1][0] - time - 1;
            
            // 붕대감기
            hp += (term)*bandage[1] + (term/bandage_time)*bandage[2];
            if(hp > health) hp = health;
            System.out.println(hp);
        }
        
        // 마지막 턴
        // System.out.println(hp);
        hp -= attacks[attacks.length-1][1];
        if(hp <= 0) return -1;
        
        return hp;
    }
}

자체 피드백

문제를 풀면서 맞왜틀한 포인트가 있었는데

  1. hp += (term)bandage[1] + (term/bandage_time)bandage[2]; 여기서 왜그랬는지 모르겠지만, 처음 hp += (term) + (term/bandage_time); 이렇게 썼었다. 그니까 1초에 1 회복하고 보너스도 1이라고 착각한 것이다... 이건 집중을 안해서 그런 것 같다..
  2. 2와 5 시점에 공격을 당한다면 텀은 2(3, 4)가 된다. 근데 처음에 5-2 = 3 이렇게 계산해서(5도 공격을 당하기 때문에 무효인데, 이 경계를 제대로 생각하지 못했다) 잠깐 헤맸었다.
profile
블로그 이전하려고 합니다! 👉 https://onfonf.tistory.com 🍀

0개의 댓글