[Programmers / Level1] 250137. 붕대 감기(Java)

이하얀·2024년 7월 4일
0

🕊️ 프로그래머스

목록 보기
10/47

💡 Info




입출력 조건




입출력 예시




문제 이해


  • 공격 및 붕대 사용 시간을 계산해 최종으로 남은 체력을 계산하는 문제


알고리즘


풀이 시간 : 55분

  • 각 변수 선언
    • 현재 체력 : nowH
    • 마지막 공격 시간 : lastAttack
    • 다음 공격 : nextAttack
    • 붕대 감고 있는 시간 : bandageTime
  • 마지막 공격 시간까지 for문
    • 현재 시간과 다음 공격 시간이 같다면 -> 몬스터의 공격 시간
      • bandageTime 초기화
      • 현재 체력에서 현재 공격의 데미지 빼기
      • 다음 공격 증가시키기
    • 현재 시간과 다음 공격 시간이 같지 않다면 -> bandageTime 증가 및 체력 회복
      • bandageTime과 bandage가 같아지면
      • banddage를 초기화
    • 현재 체력이 처음 체력을 넘지 않도록 하기
  1. NowH 반환
import java.util.*;

class Solution {
    
    static int nowH = 0; //현재 체력
    static int lastAttack = 0; //마지막 공격 시간
    static int nextAttack = 0; //다음 공격
    static int bandageTime = 0; //붕대 감고 있는 시간
    
    public int solution(int[] bandage, int health, int[][] attacks) {
        
        nowH = health;
        lastAttack = attacks[attacks.length-1][0];
        
        for(int i=0; i<lastAttack; i++){
            
            //현재 시간과 다음 공격 시간이 같다면 -> 몬스터 공격 시간
            if(i == attacks[nextAttack][0]){
                bandageTime = 0;
                nowH = nowH - attacks[nextAttack][1];
                nextAttack++;
            }
            
            //현재 시간과 다음 공격 시간이 같지 않다면 -> bandageTime 증가 및 체력 회복
            else {
                bandageTime++;
                nowH += bandage[1];
                
                //bandageTime과 bandage가 같아지면
                if(bandageTime == bandage[0]) bandageTime = 0;
                if(nowH > health) nowH = health;
            }
        }        
        return nowH;
    }
}


오답체크


  • 캐릭터의 체력이 0 이하가 되는 경우만 테스트가 통과함.
    • 현재 시간이 lastAttack까지 포함할 수 있도록 변경
    • 현재 시간과 nextAttack이 같은 경우에 "nextAttack < attacks.length" 조건을 추가하여 공격 받은 만큼만 감소할 수 있도록 범위 조정
    • -1을 출력해야하는 경우 추가
    • bandageTime과 bandage가 같아지는 부분을 검사하는 if문에 시간을 전부 소비한 경우를 추가
//before
for(int i=0; i<lastAttack; i++){

	//현재 시간과 다음 공격 시간이 같다면 -> 몬스터 공격 시간
    if(i == attacks[nextAttack][0]){
    	bandageTime = 0;
        nowH = nowH - attacks[nextAttack][1];
        nextAttack++;
    }
            
    //현재 시간과 다음 공격 시간이 같지 않다면 -> bandageTime 증가 및 체력 회복
    else {
    	bandageTime++;
        nowH += bandage[1];
        
        //bandageTime과 bandage가 같아지면
        if(bandageTime == bandage[0]) bandageTime = 0;
        	if(nowH > health) nowH = health;
        }
    }        
    return nowH;

//after
//수정: 현재 시간이 lastAttack까지 포함할 수 있도록 변경
        for(int i=1; i<=lastAttack; i++){
            
            //수정: 현재 시간과 다음 공격 시간이 같다면 -> 몬스터 공격 시간
            if(nextAttack < attacks.length && i == attacks[nextAttack][0]){
                nowH -= attacks[nextAttack][1];
                
                //수정: -1 출력하는 경우 추가
                if(nowH <= 0){
                    nowH = -1;
                    break;
                }
                nextAttack++;
            }
            
            //현재 시간과 다음 공격 시간이 같지 않다면 -> bandageTime 증가 및 체력 회복
            else {
                bandageTime++;
                nowH += bandage[1];

                //bandageTime과 bandage가 같아지면
                if(bandageTime == bandage[0]) {
                    //수정: 시간 전부 소비한 경우 추가
                    nowH += bandage[2];
                    bandageTime = 0;
                }

                if(nowH > health) {
                    nowH = health;
                }
            }
        }        
        return nowH;


최종 풀이


풀이 시간 : 1시간 20분(첫 풀이 시간 포함)

  • 각 변수 선언
    • 현재 체력 : nowH
    • 마지막 공격 시간 : lastAttack
    • 다음 공격 : nextAttack
    • 붕대 감고 있는 시간 : bandageTime
  • 마지막 공격 시간까지 for문
    • 현재 시간과 다음 공격 시간이 같다면 -> 몬스터의 공격 시간
      • bandageTime 초기화
      • 현재 체력에서 현재 공격의 데미지 빼기
      • 다음 공격 증가시키기
    • 현재 시간과 다음 공격 시간이 같지 않다면 -> bandageTime 증가 및 체력 회복
      • bandageTime과 bandage가 같아지면
      • banddage를 초기화
    • 현재 체력이 처음 체력을 넘지 않도록 하기
import java.util.*;

class Solution {
    
    static int nowH = 0; //현재 체력
    static int lastAttack = 0; //마지막 공격 시간
    static int nextAttack = 0; //다음 공격
    static int bandageTime = 0; //붕대 감고 있는 시간
    
    public int solution(int[] bandage, int health, int[][] attacks) {
        
        int nowH = health;
        lastAttack = attacks[attacks.length-1][0];
        
        //수정: 현재 시간이 lastAttack까지 포함할 수 있도록 변경
        for(int i=1; i<=lastAttack; i++){
            
            //수정: 현재 시간과 다음 공격 시간이 같다면 -> 몬스터 공격 시간
            if(nextAttack < attacks.length && i == attacks[nextAttack][0]){
                nowH -= attacks[nextAttack][1];
                
                //수정: -1 출력하는 경우 추가
                if(nowH <= 0){
                    nowH = -1;
                    break;
                }
                nextAttack++;
            }
            
            //현재 시간과 다음 공격 시간이 같지 않다면 -> bandageTime 증가 및 체력 회복
            else {
                bandageTime++;
                nowH += bandage[1];

                //bandageTime과 bandage가 같아지면
                if(bandageTime == bandage[0]) {
                    //수정: 시간 전부 소비한 경우 추가
                    nowH += bandage[2];
                    bandageTime = 0;
                }

                if(nowH > health) {
                    nowH = health;
                }
            }
        }        
        return nowH;
    }
}

  • 정확성 테스트 실패
    • bandageTime = 0;로 초기화를 해주지 않아 생긴 문제
...
//수정: 현재 시간과 다음 공격 시간이 같다면 -> 몬스터 공격 시간
if(nextAttack < attacks.length && i == attacks[nextAttack][0]){
	bandageTime = 0; //수정: 초기화 추가
    
...


결과



profile
언젠가 내 코드로 세상에 기여할 수 있도록, BE 개발 기록 노트☘️

0개의 댓글