붕대 감기 문서의 문제 1 풀이 코드다. if __name__ == "__main__": 아래가 자체 테스트다.
"""붕대 감기 (프로그래머스 250137) 풀이와 검증."""
import random
def solution(bandage, health, attacks):
t, x, y = bandage
hp, streak = health, 0
attack_at = {when: dmg for when, dmg in attacks}
last = attacks[-1][0]
for time in range(1, last + 1):
if time in attack_at:
hp -= attack_at[time]
streak = 0
if hp <= 0:
return -1
else:
streak += 1
hp += x
if streak == t:
hp += y
streak = 0
hp = min(hp, health)
return hp
def by_gaps(bandage, health, attacks):
"""공격 사이의 빈 시간 g초를 한 번에: g*x + (g // t)*y 회복."""
t, x, y = bandage
hp, prev = health, 0
for when, dmg in attacks:
g = when - prev - 1
hp = min(health, hp + g * x + (g // t) * y)
hp -= dmg
if hp <= 0:
return -1
prev = when
return hp
if __name__ == "__main__":
assert solution([5, 1, 5], 30, [[2, 10], [9, 15], [10, 5], [11, 5]]) == 5
assert solution([3, 2, 7], 20, [[1, 15], [5, 16], [8, 6]]) == -1
assert solution([4, 2, 7], 20, [[1, 15], [5, 16], [8, 6]]) == -1
assert solution([1, 1, 1], 5, [[1, 2], [3, 2]]) == 3
assert solution([3, 1, 2], 10, [[2, 4], [7, 3]]) == 7
rng = random.Random(250137)
for _ in range(3000):
bandage = [rng.randint(1, 6), rng.randint(1, 5), rng.randint(1, 5)]
health = rng.randint(1, 40)
times = sorted(rng.sample(range(1, 60), rng.randint(1, 8)))
attacks = [[w, rng.randint(1, 15)] for w in times]
assert solution(bandage, health, attacks) == by_gaps(bandage, health, attacks)
print("ALL CHECKS PASSED")