알고리즘
프로그래머스 [Lv. 1] [PCCP 기출문제] 1번 / 붕대 감기 {언어 : Python}
스위태니
2024. 3. 30. 20:51
728x90
문제 링크
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
풀이 방법
- 일단 회복을 먼저 시킨다.
- 회복시 고려할 점이 현재 시간이다.
- 현재 시간은 0으로 먼저 시작하고 현재 hp도 health로 최대 체력으로 시작한다.
- 공격을 받은 시점이 2초라고 하면 1초만 회복이 가능하다.
- 즉 공격을 받은 시점 에서 현재 시점을 뺀 다음 1을 빼야한다는 말이다.
- 회복시간을 계산하고 초당 회복량인 x를 곱한다.
- 추가 회복량은 회복시간을 시전 시간인 t로 나눈 후 y를 곱해주면 된다.
- 시전 시간이 5이고 회복 시간이 3인 경우 자연스럽게 0 * y가 되면서 추가 회복은 0이다.
- 추가 회복량은 회복시간을 시전 시간인 t로 나눈 후 y를 곱해주면 된다.
- 여기서 회복을 받은 현재의 hp가 최대 회복량을 넘었는지 비교하며 회복을 시킨다.
- min(health, startHP + 회복량)으로 하면 어떤 경우에서도 최대 체력인 health를 넘지 못하게 된다.
- 회복시 고려할 점이 현재 시간이다.
- 회복이 끝나면 공격을 받는다.
- 여기서 데미지가 현재 체력을 넘어서거나 같으면 hp가 0이하가 되므로 죽게 된다.
- isAlived를 False로 바꾸고 반복문을 종료시킨다.
- 반복문을 종료시키면 불필요한 연산을 줄일 수 있어 성능을 향상 시킬 수 있다.
- 당연하게도 hp가 많으면 데미지만큼 빼주면 된다.
- 여기서 데미지가 현재 체력을 넘어서거나 같으면 hp가 0이하가 되므로 죽게 된다.
- 마지막으로 살아있는지를 확인한다.
- 죽었으면 -1
- 살아있으면 startHP를 반환한다.
느낀점
- 쉬운 문제도 방심하지 않고 최선을 다해서 풀어야 한다.
728x90