프로그래머스

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

코 밑 2024. 12. 22. 18:24
Contents

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

오랜만의 코딩 테스트 포스팅입니다

옛날에 아는 형님이 추천해준 문제인데 귀차나가지고... 안풀다가 딱 생각이 나서 풀어봤읍니다...

재밌고 난이도도 적당하다고 했는데 ㄹㅇ 재밌는 문제긴 함

장문의 문제이긴 하지만 술술 읽힙니다

 

문제를 설명드리자면 게임에서 붕대를 감아서 몬스터에게 까인 피를 채울 수 있습니다

붕대는 초당 피가 차고 주어진 시전 시간을 다 채우면 추가 회복 효과도 있습니다 개혜자네요

반환은 캐릭터의 최종 체력이고 중간에 맞아 죽으면 -1을 반환합니다

 

매개변수는 세개가 있는데

1. bandage : 붕대 시전 시간, 초당 회복량, 풀 차징 시 추가 회복량 이 있는 1차원 배열

2. health : 캐릭터의 최대 체력

3. attacks : 몬스터의 공격 시간, 공격 피해량 이 있는 2차원 배열

 

몬스터의 마지막 공격 시간까지 반복을 해줬습니다

조건문으로 몬스터가 공격을 한다면 힐링 스택이 초기화되고 그 턴에는 힐링할 수 없습니다

 

반대로 공격이 없다면 초당 회복량만큼 그 턴에 회복을 하고 붕대 시전 시간만큼 회복을 이어서 했다면 추가 회복량을 추가로 회복시켜 줍니다

물론 최대 체력을 넘어선 안되겠죠

 

체력이 0 이하면 -1 반환

 

먼저 80점짜리 코드

// 프로그래머스 붕대 감기
// 피가 닳았을 때 붕대를 감아 피를 채울 수 있음
// 붕대를 감아서 얻은 수 있는 피 : t * 초 + y(풀차징 성공 시 추가 체력)
// 공격 당하면 기술이 끊김
// bandage[시전 시간, 1초당 회복량, 추가 회복량]
// health : 최대 체력
// attacks[공격 시간, 피해량]
class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        // 현재 체력
        int curhealth = health;
        // 몬스터 공격 카운터, 연속 힐링 스택
        int cnt = 0, stack = 0;

        // 마지막 몬스터 공격 시간까지 반복
        for (int i = 0; i < attacks[attacks.length - 1][0] + 1; i++) {

            // 몬스터의 공격
            if (attacks[cnt][0] == i) {
                curhealth -= attacks[cnt][1];

                // 힐링 스택 까임
                stack = 0;
                cnt++;
            }
            // 안 맞았을 때 피 회복 시도
            else {
                // 힐링 스택
                stack++;

                // 초당 피 회복
                curhealth += bandage[1];

                // 힐링 풀차징 성공
                if (stack == bandage[0]) {
                    curhealth += bandage[2];
                }

                // 오버 힐링 x
                if (curhealth > health)
                    curhealth = health;
            }
            // System.out.println("time : " + i + " health : " + curhealth);

            // 사망
            if (curhealth <= 0)
                return -1;
        }
        return curhealth;
    }
}

위의 코드 ㄹㅇ 왜안되는지 모르고 대가리만 박았습니다

알고보니까 풀차징 성공 시에 힐링스택 초기화를 안넣었던겨;;;

 

 

정답 코드(힐링 스택 초기화 추가)

// 프로그래머스 붕대 감기
// 피가 닳았을 때 붕대를 감아 피를 채울 수 있음
// 붕대를 감아서 얻은 수 있는 피 : t * 초 + y(풀차징 성공 시 추가 체력)
// 공격 당하면 기술이 끊김
// bandage[시전 시간, 1초당 회복량, 추가 회복량]
// health : 최대 체력
// attacks[공격 시간, 피해량]
class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        // 현재 체력
        int curhealth = health;
        // 몬스터 공격 카운터, 연속 힐링 스택
        int cnt = 0, stack = 0;

        // 마지막 몬스터 공격 시간까지 반복
        for (int i = 0; i < attacks[attacks.length - 1][0] + 1; i++) {

            // 몬스터의 공격
            if (attacks[cnt][0] == i) {
                curhealth -= attacks[cnt][1];

                // 힐링 스택 까임
                stack = 0;
                cnt++;
            }
            // 안 맞았을 때 피 회복 시도
            else {
                // 힐링 스택
                stack++;

                // 초당 피 회복
                curhealth += bandage[1];

                // 힐링 풀차징 성공
                if (stack == bandage[0]) {
                    curhealth += bandage[2];
                    // 힐링 스택 초기화
                    stack = 0;
                }

                // 오버 힐링 x
                if (curhealth > health)
                    curhealth = health;
            }
            // System.out.println("time : " + i + " health : " + curhealth);

            // 사망
            if (curhealth <= 0)
                return -1;
        }
        return curhealth;
    }
}

 

간만에 재밌는 문제였습니다!

다음에 더 재밌는 포스팅으로 돌아올게요!

 

다시 운동 시작한다.