문제
풀이
💡 입력들의 범위를 살펴보자

전반적으로 숫자 범위가 작으니 구현에만 집중해도 될 것 같다는 생각이 들었다.
구현 문제는 오랜만이라... 한 시간 안에 풀려고 노력했다.
처음에는 time = 0으로 두고, 1초씩 증가시키면서 아래 링크에 있는 풀이처럼 풀려고 했는데
연속 성공이랑 공격 여부 관리가 귀찮아질 것 같아서
최대한 attacks 배열로만 접근할 수 없을까(공격을 당하는 시간만 고려)... 고민하게 되었다.
https://school.programmers.co.kr/questions/86486
첫 번째 시도
TC 반만 맞고 반은 틀렸다.
놓친 부분이 어디일까....
" t초 연속으로 붕대를 감는 데 성공한다면 y만큼의 체력을 추가로 회복합니다. "
" t*2초 연속으로 붕대를 감는 데 성공한다면 y*2만큼의 체력을 추가로 회복합니다. "
" t*3초 연속으로 붕대를 감는 데 성공한다면 y*3만큼의 체력을 추가로 회복합니다. "
...
no_attack_time으로 1번째 공격과 2번째 공격 사이에 얼마나 공격을 안 받았는지 시간을 재는데
초당 회복량은 잘 곱해서 더해줬으나,
추가 회복량은 1번만 회복하도록 고정시켜버린 것이 문제였다.
bandage: [3, 2, 10]
health: 50
attacks: [[8, 5], [12, 20]]
위와 같은 예시가 있을 때, 첫 번째 공격이 들어왔을 때 no_attack_time = 7
공격을 당하지 않는 7초 동안 붕대 감기라는 기술을 온전히 2번 수행할 수 있다 (붕대감기 시전 시간: 3초)
이에 로직을 개선해서 체력을 계산해주면
기본 회복량 = 7 * bandage [1] = 14
보너스 횟수(붕대감기 시전 횟수) bonus_cnt = 7 // 3 = 2 → 보너스 회복량 = 2 * bandage[2] = 20
def solution(bandage, health, attacks):
answer = 0
cur_time = 0
cur_health = health
for attack in attacks:
if cur_health <= 0:
return -1
print("cur_health: " + str(cur_health))
attack_time, attack_dmg = attack
no_attack_time = attack_time - 1 - cur_time
print("no_attack_time: " + str(no_attack_time))
if no_attack_time >= bandage[0]: # Bonus
cur_health += (no_attack_time*bandage[1])
cur_health += bandage[2]
else:
cur_health += (no_attack_time*bandage[1])
cur_health = min(cur_health, health)
cur_time = attack_time
cur_health -= attack_dmg
answer = cur_health
if answer == 0:
return -1
else:
return answer
최종 코드
def solution(bandage, health, attacks):
answer = 0
cur_time = 0
cur_health = health
for attack in attacks:
if cur_health <= 0:
return -1
print("cur_health: " + str(cur_health))
attack_time, attack_dmg = attack
no_attack_time = attack_time - 1 - cur_time
print("no_attack_time: " + str(no_attack_time))
if no_attack_time >= bandage[0]: # 추가 회복
cur_health += (no_attack_time*bandage[1])
# 시전 시간마다 추가 회복 진행.
# 예시 1번에서 10초동안 공격받지 않았다면 5*2만큼 추가 회복
cur_health += (no_attack_time//bandage[0])*bandage[2]
else:
cur_health += (no_attack_time*bandage[1])
cur_health = min(cur_health, health) # 체력 max 넘지 않도록 조정
cur_time = attack_time
cur_health -= attack_dmg
answer = cur_health
if answer == 0:
return -1
else:
return answer
'Algorithm > 프로그래머스' 카테고리의 다른 글
| [프로그래머스/Python] PCCP 기출문제 1번 / 동영상 재생기 (0) | 2025.12.06 |
|---|---|
| [프로그래머스/Python] PCCP 기출문제 2번 / 석유 시추 (0) | 2025.12.05 |
| [프로그래머스/Python] PCCP 기출문제 2번 - 퍼즐 게임 챌린지 (0) | 2025.12.03 |