본문 바로가기
코테

[JS] 붕대감기 (해설포함)

by zenna 2024. 3. 1.
728x90
테스트케이스 최대 소요시간 : 0.20ms

 

문제 요약

//1초에 x만큼 회복하고, t를 채우면 y가 추가됨
bandage = [시전시간 t, 초당회복력x, 추가회복량 y]
health = 최대체력
attacks = [ [공격시간,피해량], [공격시간, 피해량] ...]

 

제출답안

function solution(bandage, health, attacks) {    
    let nowhealth = health - attacks[0][1];
    
    if (nowhealth <= 0 ){ 
        return -1; 
    }else{
        for(let i = 1 ; i < attacks.length ; i++){ 
            let minusTime = attacks[i][0]-attacks[i-1][0] -1; 
            nowhealth += minusTime * bandage[1] + parseInt(minusTime/bandage[0])*bandage[2];
            nowhealth = (nowhealth > health) ? health : nowhealth;
            nowhealth -= attacks[i][1]; 
            
            if (nowhealth <= 0 ){ 
                return -1 ; 
            }    
        }
    }
    return nowhealth; 
}

 

답안설명

function solution(bandage, health, attacks) {    
    // nowhealth = 현재체력. 첫번째 공격까지는 최대체력 health와 동일
    let nowhealth = health - attacks[0][1]; // 1번째 공격
    
    if (nowhealth <= 0 ){ // 1공격만에 사망한경우
        return -1; // -1 리턴
    }else{
        // 2번째 공격부터는 FOR문으로 진행됨
        for(let i = 1 ; i < attacks.length ; i++){ //1번째 공격은 이미 진행되었으므로 i = 1로 시작
            // minusTime = 현재 공격과 이전 공격의 시간차이(초)
            let minusTime = attacks[i][0]-attacks[i-1][0] -1; 
                                                // 이번 공격을 받기 직전의 회복된 상태를 만들려는 것이므로 -1
            nowhealth += minusTime * bandage[1] + parseInt(minusTime/bandage[0])*bandage[2];
                                                // 시간차이 * 초당 회복량 + 연속성공횟수 * 추가 회복량
            nowhealth = (nowhealth > health) ? health : nowhealth;
                                                // 회복된 체력이 최대체력을 넘는 경우 최대체력으로 맞춰줌
            nowhealth -= attacks[i][1]; // (i+1)번째 공격받음
            
            if (nowhealth <= 0 ){ // 사망했다면
                return -1 ; // -1리턴
            }    //사망하지 않았다면 다음 회차의 공격 계산
        }
    }
    return nowhealth; // 남은체력 리턴    
}

 

728x90

댓글