몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 1] [PCCP 기출문제] 1번 / 붕대 감기 {언어 : Python} 본문

알고리즘

프로그래머스 [Lv. 1] [PCCP 기출문제] 1번 / 붕대 감기 {언어 : Python}

스위태니 2024. 3. 30. 20:51

문제 링크

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

 

프로그래머스

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

programmers.co.kr

정답 코드

def solution(bandage, health, attacks):
    t, x, y = bandage
    startHP = health
    currentTime = 0
    isAlived = True
    
    # at : attack time || ad : attack damage
    for at, ad in attacks:
        # 일단 회복 시키고 때린다.
        diffTime = at - currentTime - 1
        startHP = min(health, startHP + (diffTime * x) + (diffTime // t) * y)
        if startHP <= ad:
            isAlived = False
            break
        else:
            startHP -= ad
        currentTime = at
    answer = -1
    if isAlived:
        answer = startHP
    
    return answer

풀이 방법

  1. 일단 회복을 먼저 시킨다.
    1. 회복시 고려할 점이 현재 시간이다.
      1. 현재 시간은 0으로 먼저 시작하고 현재 hp도 health로 최대 체력으로 시작한다.
      2. 공격을 받은 시점이 2초라고 하면 1초만 회복이 가능하다.
        1. 즉 공격을 받은 시점 에서 현재 시점을 뺀 다음 1을 빼야한다는 말이다. 
    2. 회복시간을 계산하고 초당 회복량인 x를 곱한다.
      1. 추가 회복량은 회복시간을 시전 시간인 t로 나눈 후 y를 곱해주면 된다.
        1. 시전 시간이 5이고 회복 시간이 3인 경우 자연스럽게 0 * y가 되면서 추가 회복은 0이다.
    3. 여기서 회복을 받은 현재의 hp가 최대 회복량을 넘었는지 비교하며 회복을 시킨다.
      1. min(health, startHP + 회복량)으로 하면 어떤 경우에서도 최대 체력인 health를 넘지 못하게 된다.
  2. 회복이 끝나면 공격을 받는다.
    1. 여기서 데미지가 현재 체력을 넘어서거나 같으면 hp가 0이하가 되므로 죽게 된다.
      1. isAlived를 False로 바꾸고 반복문을 종료시킨다.
      2. 반복문을 종료시키면 불필요한 연산을 줄일 수 있어 성능을 향상 시킬 수 있다.
    2. 당연하게도 hp가 많으면 데미지만큼 빼주면 된다.
  3. 마지막으로 살아있는지를 확인한다.
    1. 죽었으면 -1
    2. 살아있으면 startHP를 반환한다.

 

느낀점

  • 쉬운 문제도 방심하지 않고 최선을 다해서 풀어야 한다.