본문 바로가기

취업/코딩테스트

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

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

 

정답

- 몬스터가 공격하는 시간을 체크하기 위해 Stack 사용

- for문으로 일일히 시간을 확인하는 것보다 맨 앞의 시간 가져온 후 버리는게 효율적이라고 생각함

import java.util.*;

class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        int t = 0; // 시간
        int s = 0; // 연속 성공
        int h = health; // 체력 변화량
        
        int frontAttack = 0; // 공격 시간 버퍼
        
        Stack<Integer> attackTime = new Stack<>(); // 공격 시간을 저장할 스택 선언
        for (int i = 0; i < attacks.length; i++){
            attackTime.push(attacks[i][0]); // 공격 시간만 저장
        }
        
        frontAttack = attackTime.pop(); // 앞선 시간부터 빼오기
        int k = 0; // 인덱스 확인
        
        while (t < attacks[attacks.length-1][0]){
            
            t++; // 시간 흐름
            
            // 몬스터 공격 시간 //
            if (t == frontAttack){ // 공격 확인
                h -= attacks[k][1]; // 체력 감소
                s = 0; // 연속 성공 초기화
                
                if (h <= 0){ // 캐릭터가 죽은 경우
                    h = -1;
                    break;
                }
                
                if (k < attacks.length){
                    frontAttack = attackTime.pop(); // 다시 시간 빼오기
                    k++;
                }
                continue;
            }
            
            // 붕대 감기 시간 //
            if (h < health){ // 최대 체력이 아닐 경우
                h += bandage[1]; // 초당 회복
            }
            s += 1; // 연속 성공 증가
            
            if (s == bandage[0]){ // 연속 성공 달성 시
                if (h < health - bandage[2]){
                    h += bandage[2]; // 완전히 추가 회복
                } else if (health - bandage[2] <= h && h < health){
                    h = 30; // 최대 체력까지만 추가 회복
                }
                s = 0; // 연속 성공 초기화
            }
            
        }
        
        int answer = h;
        return answer;
    }
}

 

시간복잡도

While문으로 O(n)

 

다른 사람 풀이