[PCCP 기출문제] 1번 / 붕대 감지 with Java

2024. 2. 29. 10:20코딩테스트 리뷰(프로그래머스)/코딩 테스트 Lv.1

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

 

프로그래머스

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

programmers.co.kr

문제 설명

어떤 게임에는 붕대 감기라는 기술이 있습니다.
붕대 감기는 t초 동안 붕대를 감으면서 1초마다 x만큼의 체력을 회복합니다. t초 연속으로 붕대를 감는데 성공한다면 y만큼의 체력을 회복합니다. 게임 케릭터에는 최대 체력이 존재해 현재 체력이 최대 체력보다 커지는 것을 불가능합니다.

기술을 쓰는 도중 몬스터에게 공격을 당하면 기술이 취소되고, 공격을 당하는 순간에는 체력을 회복할 수 없습니다. 몬스터에게 공격당해 기술을 취소당하거나 기술이 끝나면 그 즉시 붕대 감기를 다시 사용하며, 연속 성공시간이 0으로 초기화됩니다.

몬스터의 공격을 받으면 정해진 피해량만큼 현재 체력이 줄어듭니다. 이때, 현재의 체력이 0 이하가 되면 케릭터가 죽으며 더 이상 체력을 회복 할수 없습니다.

당신은 붕대감기 기술의 정보, 케릭터가 가진 최대 체력과 몬스터의 공격패턴이 주어질 때 케릭터가 끝까지 생존할 수 있는지 궁금합니다.

붕대감기 기술의 시전 시간, 1초당 회복량, 추가 회복량을 담은 1차원 정수 배열bandage와 최대체력을 의미하는 정수 health, 몬스터의 공격시간과 피해량을 담은 2차원 정수 배열 attacks가 매개변수로 주어집니다. 모든 공격이 끝난 직후 체력을 return 하도록 solution 함수를 완성해주세요. 만약 몬스터의 공격을 받고 케릭터의 체력이 0 이하가 되어 죽는다면 -1을 return 해주세요.

제한사항

  • bandage는 [시전 식단, 초당 회복량, 추가 회복량] 형태의 길이가 3인 정수 배열입니다.
  • 1 <= health <= 1000
  • 1 <= attacks.length <= 100

 

 

class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        int answer = health; //answer 현재 체력
        for ( int tic = 0, at = 0, straight = 0; // tic 은 1턴, at 는 공격타이밍. straight 체력회복 연속성공 5회
        		tic <= attacks[attacks.length-1][0]; tic++) { 
         
            if( answer <= 0) return -1; //죽으면 -1 리턴
            if ( attacks[at][0] == tic) { // 공격을 받으면 붕대 취소
                answer -= attacks[at++][1];
                straight = 0;
                continue;
            }
            answer += bandage[1];
            straight++;
            if( straight == bandage[0] ) { // 시전시간 끝내면 추가 회복 on
                answer += bandage[2];
                straight = 0;
            }
            if(answer >= health) answer = health;
        }
        return answer <= 0 ? -1 : answer;
    }
}

 

 

문제 해설

해당 문제 설명을 읽어보면 조건은 3가지입니다.

  • 붕대를 감으면 t초 동안 가능하고, x씩 회복하며 t초가 되면 y만큼 추가 회복
  • 몬스터에게 공격을 받으면 회복이 취소됩니다. ( 연속 성공이 취소되는 것 )
  • hp가 0 이하가 되면 -1리턴

문제에서 저는 공격을 받으면 회복이 안된다고 해서 문제부터 이해를 못했는데, 자세히 읽어보니 취소되면 즉시 다시 붕대감기를 한다는 뜻에서 연속 성공만 취소 된다는걸 알았습니다.

 

위에 코드에서 answer는 현재 체력을 의미, health는 최대체력, tic은 1초, straight는 연속성공, at는 공격타이밍을 지정합니다.

 

answer <= 0 으로 되는 경우가 2개가 있습니다.

  • 몬스터의 공격이 끝나기 전에 hp 가 0 이하가 되는 것.
  • 몬스터의 공격이 끝나서 hp가 0이하가 되는 것.

그래서 for문에서 hp가 0이하가 되면 나오는 것과 

마지막 return 에서 hp가 0이하가 되면 리턴하는 수를 만들어 두었습니다.

 

느낀점

코딩테스트 2일차하면서 느끼는 건데, 난이도가 많이 들쑥날쑥하네요.

그리고 문제 설명 좀 풀어서 적어주면 안되나, 하나같이 읽고 이해를 한번에 못하게 만들어두는 것같네요...

 

제 자신에게 2일차 고생했다고 말해주고 끝내겠습니다.