코딩관계론

[PCCP 기출문제] 1번 / 붕대 감기도움말 본문

개발/알고리즘

[PCCP 기출문제] 1번 / 붕대 감기도움말

개발자_티모 2025. 4. 27. 13:52
반응형

1. 문제 이해하기

게임 속 "붉대 감기" 기술은 일정 시간 동안 체력을 회복하는 스킬입니다. 주요 규칙은 다음과 같습니다:

    • 기본 회복: 매 1초마다 정해지는 양(x)만큼 체력을 회복합니다.
    • 연속 성공 보너스: t초 동안 끊기지 않고 성공하면 추가 회복량(y)이 더합됩니다.
    • 기술 취소: 목시터에게 공격받으면 붉대 감기가 즉시 취소되며, 공격받는 순간에는 회복을 할 수 없습니다.
    • 체력 한계: 체력은 최대 체력을 넘어서 회복할 수 없습니다.
    • 사망 조건: 체력이 0 이하로 떠나면 캐릭터가 죽습니다.

📌 문제 링크 바로 가기

2. 문제 해결 방법

해결 해적은 목시터 공격 간격을 계산해서 그 사이에 체력을 얼마나 회복할 수 있는지를 구하는 것입니다.

  • 현재 시간다음 공격 시간사이에 회복할 수 있는 시간을 구합니다.
  • 회복 공식은 다음과 같습니다:
    • `체력 = (다음 공격 시간 - 현재 시간 - 1) * 초당 회복치 + ((다음 공격 시간 - 현재 시간 - 1) / 연성 성공 시간) * 연속 성공 보너스
  • 회복한 체력은 최대 체력을 넘어서는 안됩니다.
  • 공격받을 때 체력이 0 이하로 떠나면 -1을 반환합니다.

3. 코드 작성

초안 코드

const DIE = -1;

function solution(bandage, health, attacks) {
    var answer = 0;
    let latestHit = 0;
    let maxHealth = health;

    health -= attacks[0][1];

    if (health <= 0) {
        return DIE;
    }

    for (let i = 1; i < attacks.length; ++i) {
        let [latestTiming, latestDamage] = attacks[i];
        let [timing, damage] = attacks[i - 1];

        let totalTime = latestTiming - timing - 1;

        health += totalTime * bandage[1];
        health += Math.floor(totalTime / bandage[0]) * bandage[2];

        health = Math.min(maxHealth, health);
        health -= latestDamage;

        if (health <= 0) {
            return DIE;
        }
    }

    return health;
}

 

코드 리뷰

1. 먼저 배열의 인덱스 값들의 접근을 모두 변수명으로 바꿈으로써 매직 넘버를 제거했다

2. 또한 기존에는 0번째를 명시적으로 계산해줌으로써 추가적인 코드가 필요했지만, 현재 시간을 추가해줌으로써 해당 코드를 모두 제거하였다.

 

const DIE = -1;

function solution(bandage, health, attacks) {
    var answer = 0;
    let currentTime = 0;
    let [castTime, healPerSecond, bonusHeal] = bandage;
    let maxHealth = health

    
    for(let [timeing, damage] of attacks){
        recoverTime = timeing - currentTime - 1
        
        health += recoverTime * healPerSecond
        health += Math.floor(recoverTime / castTime) * bonusHeal
        
        health = Math.min(health,maxHealth)
        
        health -= damage
        
        if(health <= 0){
            return DIE
        }
        
        currentTime = timeing
    }
    
    return health;
}

 

4. 배우는 것 ✍️

이번 문제를 푸면서 다음것과 같은 내용을 새로 학습했습니다.

  • JavaScript 배열 구조 분할 행사
    • Python에서는 first, second = arr로 작성했지만, JavaScript에서도 [first, second] = arr로 쉽게 사용할 수 있습니다.
    // Python
    arr = [1, 2];
    first, second = arr;
    
    // JavaScript
    let [first, second] = arr;
반응형

'개발 > 알고리즘' 카테고리의 다른 글

[PCCP 기출문제] 1번 / 동영상 재생기  (0) 2025.04.28
[카카오] 두 큐 합 같게 만들기  (0) 2024.08.23
[과제테스트] 게임 승률 조회하기(python)  (0) 2024.05.19
[백준]AC  (0) 2024.05.11
[백준] 암호 만들기  (0) 2024.05.07