[Programmers][Py] [PCCP 기출문제] 1번 / 붕대 감기

mj·2024년 7월 9일
0

코딩테스트문제

목록 보기
30/50

문제

문제 바로가기

t초동안 붕대를 감음. 1초마다 x만큼 체력 회복
t초 연속 성공하면 추가로 y체력 회복 (최대 체력 존재)

공격당하는 순간에는 회복할 수 없음.
공격당하면 연속 성공 시간이 0초로 초기화됨.
끝나는 즉시 붕대감기 다시 시작.
정해진 피해량만큼 체력이 줄어든다.
현재 체력 <= 0 이면 죽음.

매개변수

  • bandage : [시전시간, 초당 회복량, 추가 회복량]
  • health : 최대 체력
  • attacks : 몬스터의 [공격 시간, 피해량]

리턴값

  • 모든 공격이 끝난 직후 남은 체력
  • 죽었으면 -1 반환

나의 알고리즘

아이디어

💡1번. 몬스터의 마지막 공격 시간까지 for문 돌면서 초마다 상황을 업데이트
💡2번. attacks 배열을 순회하며, 공격 사이의 시간을 계산식으로 처리

예를들어 attacks배열의 값이 [[2, 10], [9, 15], [10, 5], [11, 5]]라고 하자.

  • 💡1번의 경우: 0부터 마지막 공격시간인 11까지 초당 처리한다. (0, 1, 2, 3, ... 11)
  • 💡2번의 경우: 공격시간에 대해서만 처리한다. (2, 9, 10, 11)
    2번 방법의 시행횟수가 더 적으므로 효율적이라 판단해 2번방법으로 구현하였다.

나의 풀이

  1. 공격시간 이전까지의 상황을 처리.
  • beforeTime = 이전 공격과 현재 공격 사이의 시간 계산
  • 위의 시간만큼 연송성공횟수, 체력 증가+
  • 추가체력 처리
  1. 공격 처리
  • 연속성공횟수 0으로 초기화
  • 체력 감소
  • 체력이 0이하이면 -1반환(종료)
'''
# bandage : [시전 시간, 초당 회복량, 추가 회복량]
# health : 최대 체력
# attacks : 몬스터의 [공격 시간, 피해량]
'''
def solution(bandage, health, attacks):
    castingTime = bandage[0]
    recoveryPerSec = bandage[1]
    bonusRecovery = bandage[2]

    success = 0 # 연속 성공 시간
    time = 0 # 이전 공격을 만난 시간
    maxHealth = health

    # 1. attack : [공격시간, 피해량]
    for attack in attacks:

        attackTime = attack[0] # 공격시간
        attackAmount = attack[1] # 피해량

        # 1. 공격 전까지의 상황 update
        beforeTime = max(0, attackTime - time - 1)
        success += beforeTime #연속성공누적수
        health += recoveryPerSec * beforeTime
        health = min(maxHealth, health)

        #   추가체력 처리
        sCount = success // castingTime # 추가체력 얻을 수 있는 횟수
        if(sCount >= 1):
            health += bonusRecovery * sCount
            health = min(maxHealth, health)
            success = success % castingTime

        # 2. 공격 처리 
        success = 0
        health -= attackAmount
        if health<=0: return -1


        time = attackTime

    return health

실수했던 것

  • 최대체력이 존재한다는 제한사항을 까먹어서 결과가 5이어야 하는데 7이 나왔다. 로직 자체가 잘못됐다기보단 요구사항을 까먹고 구현하지 못한거라 코드를 계속 살펴봐도 문제점을 찾을 수 없었다... 결국 입출력 예시와 비교하며 디버깅해보고 나서야 최대체력을 넘겼다는걸 알아차렸다. 요구사항을 꼼꼼히 읽고 기억해두자!!!
profile
일단 할 수 있는걸 하자.

0개의 댓글