알고리즘 문제/JAVA

[프로그래머스]250137:붕대감기(JAVA)

공백._. 2024. 3. 11. 23:33

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

 

프로그래머스

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

programmers.co.kr


  • 풀이방법[알고리즘]

단순 구현문제 같은데 은근 조건 체크해야 할 것들이 있었다. answer에 최대 체력 값을 할당하고, 몬스터의 마지막 공격 시간까지만 확인하면 되기 때문에 lastAttack이라는 변수로 값을 받아왔다. boolean 배열을 생성하여, time변수가 몬스터의 공격시간인지 확인하였다.  일단 몬스터의 공격시간은 한 번 밖에 없기 때문에, HashMap을 이용하여, 값을 가져왔다.

반복문을 통해 붕대감기와 습격을 반복한다. 반복문에서 빠져나갈 조건은 다음과 같다. 1. 캐릭터의 체력이 0보다 작을 때 2. 몬스터의 공격이 끝났을 때.
반복문에서 빠져나가지 못했다면, time변수에 1을 더하고, 공격 또는 치료를 실행한다. 공격은 시간을 키 값으로 가져와 answer에서 값을 빼고, 연속 성공 시간을 0으로 초기화한다. 공격시간이 아니면 치료를 진행한다. 연속성공시간에 1을 더하고, 최대 체력보다 커지면 넘어간다. 최대 체력보다 작으면 붕대로 치료를 한다. 

캐릭터의 체력이 음수가 되어 게임이 끝났을 경우, -1을 반환해달라고 해서 값을 설정해주었다. 테스트 케이스를 다 맞고 룰루랄라 제출을 했더니 1,2,3,4오답....

캐릭터의 체력은 최대 값을 초과할 수 없다는 문장을 제대로 인지하지 못하고 풀어서 생긴 문제였다ㅠ 붕대를 감았을 때 뿐 아니라, 연속성공으로 체력이 더해졌을 때에도 최대 체력을 넘지 못하게 확인해 줘야 한다. 나는 이 로직을 반복문 앞에 두고, 매 턴이 시작될 때마다 체크하는 형식으로 주었다.

import java.util.*;

class Solution {
    public int solution(int[] bandage, int health, int[][] attacks) {
        int answer = health;
        int time=0;
        int continuous=0;
        //몬스터의 마지막 공격까지 진행
        int lastAttack=attacks[attacks.length-1][0];
        boolean[]check = new boolean[lastAttack+1];
        HashMap<Integer,Integer>map = new HashMap();
        
        for(int i=0;i<attacks.length;i++){
            check[attacks[i][0]]=true;
            map.put(attacks[i][0],attacks[i][1]);
        }

        while(true){
            //체력이 0보다 작아지거나 마지막 공격을 했으면, 끝내기
            if(answer<=0 || time>=lastAttack ){
                break;   
            }
            //최대 체력보다 커질 수는 없다.
            if(answer>health{
                answer=health;
            }
            time++;
            //몬스터 공격시간일 때
            if(check[time]){
                //연속 치료 초기화
                continuous=0;
                answer-=map.get(time);
            }else{
                continuous++;                
                //최대 체력인지 확인
                if(answer>=health){
                    continue;
                }else{
                    answer+=bandage[1];
                    //시전시간을 채우면 추가 회복량 더해주고, 초기화
                    if(continuous==bandage[0]){
                        answer+=bandage[2];
                        continuous=0;
                    }
                }
            }
        }//while 
        if(answer<=0){answer=-1;}
    
        return answer;
    }
}