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

조승현·2024년 3월 15일

알고리즘

목록 보기
9/15
post-thumbnail

문제

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

게임을 하고 있는데 붕대를 감아 체력을 회복한다고 한다.
변수가 많으니 하나씩 잘 트랙 해봅시다


규칙

  • 사용자는 총 t초 동안 붕대를 감는다
  • 1초 동안 x만큼의 체력을 회복한다
  • t초 동안 연속으로 붕대 감는 것에 성공하면 y만큼의 체력을 추가로 회복한다
    ++ 회복한 체력이 최대로 저장 가능한 체력보다 크다면 그 이상 증가하지 않음
  • 몬스터에게 공격을 당하면 회복을 멈춘다 + 공격을 당하는 동안은 회복을 할 수 없다
  • 공격이 끝나면 다시 '붕대감기'를 사용하며, 연속 시간이 0으로 초기화된다

변수

  • bandage[기술 시전 시간(t), 1초당 회복량(x), 추가 회복량 (y)]
  • health: 최대 체력
  • attack[공격 시간, 피해량]

결괏값

  • 남은 체력을 반환
  • if 체력이 0보다 작아서 죽는다면 -1 return

알고리즘

time을 하나씩 증가시키면서 공격을 받는 시간인지 확인 (반복문 이용)
그 시간에 할 수 있는 것은 1 아니면 2다
1. 체력 회복
2. 공격 받기
-> if-else문 사용하여 둘 중 하나의 조건에만 해당하도록 하기

con 변수를 사용하여 연속 회복 성공의 초를 셈

  • 체력을 회복한다면 con++
  • 공격을 받는다면 con은 0으로 초기화
  • con이 t 값과 같아진다면 체력 회복에 y만큼을 다시 더함

반복문이 끝나는 조건

  • 공격을 받다가 체력이 0이하로 떨어질 때
  • 마지막으로 공격을 받는 순간

++ 만약 체력이 0이하로 떨어지면 즉시 -1 return!!!
이거 때문에 테스트케이스 2개가 자꾸 실패해서 멘붕,,, ㅎㅎ

이를 고려하여 코드를 짜봅시다

코드

class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
    	// 초기 체력을 answer로 초기화 (반환하는 것은 마지막에 남아있는 체력)
        int answer = health;
        
        // 0초일 때는 아무런 행동도 하지 않기 때문에 초기 시간을 1로 초기화
        int time = 1;
        // attacks 배열에 접근하는 변수 arr (time의 수가 attacks의 공격시간과 같으면 공격을 받도록 if문 설정)
        int arr = 0;
        // 연속 성공 시간을 세는 변수
        int con = 0;
        
        // 마지막 공격을 받을 때까지 반복
        while (time <= attacks[attacks.length-1][0]){
        	만약 지금의 시간이 공격을 받는다면 if문 실행
            if (attacks[arr][0] == time){
            	// 해당 시간의 공격력만큼 체력 줄이기
                answer -= attacks[arr][1];
                // 만약 공격을 받고 체력이 0 이하로 떨어지면 즉시 -1 return
                if (answer <= 0) return -1;
                // 다음 변수로 접근
                arr++;
                // 연속 성공 시간을 0으로 초기화
                con = 0;
            }
            else {
            	// 연속 성공 시간을 1씩 추가
                con++;
                // x 만큼 체력 증가
                answer += bandage[1];
                // 만약 연속 성공 시간이 t에 도달했다면 체력 증가 후 con 0으로 초기화
                if (con == bandage[0]){
                    answer += bandage[2];
                    con = 0;
                }
                // 만약 최대 체력보다 더 큰 값이 입력되었으면 health까지로 변수 크기 제한하기
                if (answer > health)
                    answer = health;
            }
            // time 값 증가
            time++;
        }
        return answer;
    }
}

마무리

역시 프로그래머스에서 코딩하면 어디서 오류가 뜨는지 알아내기 어렵다..
테스트 케이스를 다 돌렸는데 딱 2개만 실패하고 왜 실패했는지 안 알려줘서 다시 한 번 문제를 꼼꼼히 읽었다 ㅠㅠ
그래도 경우의 수를 잘 나누면 하기 좀 괜찮았다

아 그리고 실행결과 단계별로 하나씩 보여주는 걸 더 참고해야겠다..
문제에서 알려주는 것에는 다 이유가 있는 법

0개의 댓글