똘이의 개발 Life

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

코딩테스트/프로그래머스

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

또리또리똘 2024. 1. 7. 21:29
728x90

 

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

걸린 시간 33분

 

피드백

- 이런 문제는 잘 정리해서 푸는게 핵심일듯..

물론 다른 문제도 주석처리 이런거 꼼꼼하게 하는게 좋지만

 

문제

 

붕대 감기

t 초 동안 붕대를 감음

1초마다 x만큼 회복

t초 연속으로 붕대 감는데 성공하면 y만큼 체력 추가 회복

최대 체력보다 높아질 수 는 없음

몬스터에게 공격 당하면 기술 취소

공격을 당하는 순간에는 체력 회복 x

취소 당하는 즉시 붕대 감기를 다시 사용하고 연속 성공 시간이 0

공격 받으면 정해진 피해량 만큼 현재 체력이 줄어듬

모든 공격이 끝난 후 남게 되는 체력을 출력

현재 체력이 0 이하가 되면 캐릭터 사망 체력회복 x

붕대 감기 기술의 정보로

캐릭터가 가진 최대 체력과 몬스터의 공격 패턴이 주어지면 캐릭터가 끝까지 생존할 수 있는지

캐릭터 죽으면 -1

bandage [ 시전 시간 , 초당 회복량 , 추가 회복량 ]

health 최대 체력

attacks [ 공격 시간 , 피해량 ]

공격시간은 오름차순 정렬

공격 시간은 모두 다 다름

 

주석 참고

public class Pro250137 {

    public static void main(String[] args) {
        System.out.printf("" + solution(new int [] { 5 , 1 , 5 } , 30 , new int[][] { {2, 10}, {9, 15}, {10, 5} ,{11, 5} }));
    }

    static int solution( int[] bandage , int health , int[][] attacks){
        int answer = 0;

        int last_time = attacks[attacks.length-1][0]; // 마지막 공격 시간
        int now_h = health; // 현재 체력
        int a_idx = 0; // 공격한 횟수
        int h_idx = 0; // 회복한 횟수
        int si_time = bandage[0]; // 시전 시간
        int healing = bandage[1]; // 초당 회복량
        int b_healing = bandage[2]; // 추가 회복량


        // 마지막 공격까지 시간 흐름 i 는 턴을 의미함
        for (int i = 1; i <= last_time ; i++) {
            // 공격 시간과 턴이 같으면
            if (attacks[a_idx][0] == i){
                now_h -= attacks[a_idx][1]; // 현재 체력에서 공격데미지 차감
                a_idx++; // 공격 횟수 +1
                h_idx = 0; // 시전 횟수 초기화
                // 현재 체력이 0 이하 일 경우 사망
                if (now_h <= 0){
                    return -1;
                }
            }
            // 공격을 당하지 않았을 경우
            else {
                // 현재 체력이 총 체력보다 작으면
                if (now_h < health){
                    h_idx++; // 연속 회복 횟수 +1
                    now_h += healing; // 현재 체력에서 초당 회복량 더하기
                    if (h_idx == si_time){
                        now_h += b_healing;
                        h_idx =0;
                    }
                    if (now_h > health){ // 현재 체력이 총 체력 보다 높을 경우
                        now_h = health; // 현재 체력 총 체력과 같음
                    }
                }
            }
        }
        answer = now_h;


        return answer;
    }

}
728x90