알고리즘 풀이

[알고리즘] 프로그래머스 lv.1 | 붕대 감기

째깍단 2024. 2. 13. 16:36

붕대 감기

답: 

더보기
def solution(bandage, health, attacks):
    t, x, y = bandage
    hp = health
    이전공격시간 = 0

    for attack in attacks:
        공격시간, 피해량 = attack
        스킬시전시간 = (공격시간 - 이전공격시간)    

        시간 = 1
        연속성공 = 0
        if 스킬시전시간 > 1:
            while 시간 < 스킬시전시간:
                hp += x
                print(hp)

                연속성공 += 1

                if 연속성공 >= t:
                    hp += y
                    연속성공 = 0

                if hp >= health:
                    hp = health
                
                시간 += 1
                print(시간, hp, 연속성공)
            
        hp -= 피해량

        if hp <= 0:
            hp = -1
            break

        이전공격시간 = 공격시간

    return hp

 

 

문제 분석 및 해석

<스킬 설명>

붕대감기 : t초 동안 1초마다 체력 x 회복

t초 연속으로 붕대 감기 성공시 + y

 

<조건>

1. 캐릭터에는 최대 체력이 있어 현재체력 = 최대체력까지만 채우기 가능

 

2. 도중에 몬스터 공격을 받으면 기술 취소, 공격ing이면 체력 회복 불가.

공격받거나 기술이 끝나면 바로 붕대감기를 다시 시작하고 연속 성공시간은 0초부터 다시 시작

 

3. 공격을 받으면 정해진 피해량만큼 현재 체력이 감소. 체력이 0이하가 되면 캐릭터 사망

 

bandage = [시전 시간, 초당 회복량, 추가 회복량]

health = 최대 체력

attacks = [[몬스터의 공격 시간, 피해량], [] ...]

 

return 남은 체력 or health 0이하면 -1

 

 

 

 

>> 풀이생각

 

1) 이전공격시간을 선언, for문 끝날때 저장하고, 스킬시전시간을 계산

이전공격시간 = 0

스킬시전시간 = (공격시간 - 이전공격시간)

이전공격시간 = 공격시간

 

 

2) health가 0이 되지않았는지 체크

if hp <= 0:
    answer = -1
    break

 

 

3) 공격 받지 않았을때 스킬 지속임을 생각해 while문 혹은 for _ in range() 활용

     # 스킬 사용시 체력 증가를 반영

     # 지속된 스킬이 t초 이상인지 확인해 t초 이상인 경우 +y 해주기

 

 

4) health가 최대일때 health로 고정
    (이 부분을 위해 유동할 수 있는 값인 hp를 따로 선언해야함)

# 스킬 사용시 1초당 회복되는 체력 x
hp += x

if hp >= health:
    hp = health

 

 

5) 공격 받아 줄어든 체력이 있으면 health에 반영

hp -= 피해량

 

 

 

 

 

 

문제 해결

 

 

문제점 및 해결 1.

'스킬시전시간(공격시간 - 이전공격시간)'과 '시간'의 차이가 나지 않을 경우에도

일단 while문을 작동시켜 몬스터의 공격과 공격의 중간에도 +회복량을 하는 문제점이 있었다.

 

 

** 15 —> 16, 11 —> 12로 변한 부분

 

while문 내의 스킬 동작확인:

    print(hp)

    ...

    print(시간, hp, 연속성공)

 

print(hp, f"(-{피해량})")

 

 

while문을 스킬시전시간(스킬시전시간 = (공격시간 - 이전공격시간))이 1 이상일때만 접근할 수 있도록 if문을 추가하였다.

    if 스킬시전시간 > 1:
        while 시간 < 스킬시전시간:
            …

 

 


 

 

 

문제점 및 해결 2.

 

1, 3, 4 예시는 잘 작동하는데, 2 예시에서 답이 4가 출력되는 문제가 발생.

비교해보기 위해 주어진 입출력 예시와 비슷하게 print하였다

 

 

 

해결 방법은 코드의 순서를 바꾸는 것이었다. 

 

1) 시간 = 1 부터 시작 (스킬이 지속되는 시간을 체크하기위한 시간, 몬스터 공격과 공격 사이의 텀)

 

 

2) 연속성공을 해당 턴에 바로 체크 할 수 있도록 수정

    for attack in attacks:
        ...
        while 시간 < 스킬시전시간:
            hp += x

            # while문 하단에 있던 코드를 상단으로 옮김
            연속성공 += 1
            if 연속성공 >= t:
                hp += y
                연속성공 = 0

 

 

3) for문의 상단에 있던 hp상태 체크를 몬스터가 공격하여 피해량을 반영한 이후로 옮김

    for attack in attacks:
        …       
        hp -= 피해량

        if hp <= 0:
            hp = -1
            break

 

 

 


 

오랜만에 뇌풀기 코딩 문제풀이. 약 20분정도 걸렸다.

 

코테 도전 했을때 긴 문제 내용으로 헷갈리게 했던 문제였다. 극뽁

가보자고~