안녕하세요

PCCP 기출 문제 1번 붕대 감기 (js) 본문

프로그래머스

PCCP 기출 문제 1번 붕대 감기 (js)

sakuraop 2023. 12. 7. 15:38

PCCP 기출 문제 (25) 1번 문제 보러가기

 

프로그래머스

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

programmers.co.kr


문제 조건 확인

    // 붕대감기
    // t초 동안 붕대를 감으면서 1초마다 x만큼의 체력을 회복
    // t초 연속으로 붕대를 감는 데 성공한다면 y만큼의 체력을 추가로 회복
    
    // 붕대 감기 연속 성공
    // 시전시간만큼 연속으로 성공하면 (1+추가 회복량)만큼 회복
    
    // 공격
    // 기술을 쓰는 도중 몬스터에게 공격을 당하면 기술이 취소
    // 공격을 당하는 순간에는 체력을 회복할 수 없습니다
    // 연속 성공 시간이 0으로 초기화
    
    // 체력
    // 최대 체력
    // 현재 체력이 0 이하가 되면 캐릭터가 죽으며 더 이상 체력을 회복할 수 없습니다.
    // 살아있으면 체력 반환, 죽으면 -1 반환

 

문제 풀이

공격이 일어나면, 붕대 감기는 시행할 수 없다.

 

공격 실행

> 체력 감소, 연속 성공 초기화

> 체력이 0이면 종료

 

(공격 실행X) && 붕대 감기

> 연속 성공 횟수 도달 시 (기본회복량 + 연속성공회복량) 만큼 체력 회복

> 최대 체력을 넘을 수 없음

 

function solution(bandage, health, attacks) {
    const [castTime,baseHeal,additionalHeal] = bandage;
    const lastTime = attacks[attacks.length - 1][0];

    const remainAttacks = attacks.reverse(); // shift대신 pop 이용

    let currentHealth = health;
    let continuousTime = 0;    
   
    for (let i=1; i<=lastTime; i++) {
        // 공격
        if (remainAttacks[remainAttacks.length - 1][0] === i) {
            const damage = remainAttacks.pop()[1];
            currentHealth -= damage; // 체력 감소
            continuousTime = 0; // 연속 성공 시간이 0으로 초기화
            
            if (currentHealth <= 0) {
                return -1; // 현재 체력이 0 이하가 되면 캐릭터가 죽으며 더 이상 체력을 회복할 수 없음
            }
            continue; // 붕대 감기 기술이 취소, 체력을 회복할 수 없음
        }
        
        // 붕대 감기
        if (++continuousTime === castTime) {
            currentHealth += (baseHeal + additionalHeal);
            continuousTime = 0; // 연속 성공 카운트 초기화
        } else {
            currentHealth += baseHeal;
        }
        
        if (currentHealth > health) {
            currentHealth = health; // 최대 체력 넘을 수 없음
        }
    }
    
    return currentHealth;
}