연습장

27. 붕대 감기 본문

프로그래머스/1단계

27. 붕대 감기

js0616 2024. 1. 22. 18:41

 

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

 

추가회복량이란 시전시간 동안 몬스터에게 공격당하지 않으면 추가로 회복되는량 

 

health : 최대 체력 ( 이 이상 회복 할 수 없음)

 

attacks = [공격시간, 피해량] 

 

몬스터가 공격하는 시간에는 회복 불가능 

 

체력이 0 이하가 되면 회복 불가능 -1 을 리턴 

 

 

목표 : 마지막 공격을 맞고 남은 피 or 도중에 죽는다면 -1 을 반환


1초단위로 상태를 계속해서 변화해야되나? 

 

현재 체력 / 연속성공 / 진행시간

 

현재 체력은 : 최대체력 >= 최대체력 + 초당회복량 - 몬스터의 공격

연속 성공 : 몬스터의 공격 하는 시간 간격에 따라 0에서 bandage[0] 까지 변화 

진행시간은 1초부터 attacks[-1][0] 초 까지 진행된다.

 

 

시간별 행동으로 생각하면 될 것 같다.

 

1. 몬스터가 공격하는 시간인가 ? 

-> 몬스터 공격력 만큼 현재 체력 감소

-> 연속 성공 0

 

2. 공격하지 않는다. 

-> 현재 체력 == 최대치인가?

-> yes : 회복하지않음

-> no : bandage[1] 만큼 회복

 

-> 연속 성공 1 증가

-> 연속 성공 == bandage[0] 인가 ?

-> yes : 0 으로 변환 , bandage[2] 만큼 체력 회복 

 

3. 마지막 attack 시 체력 감소 후 종료 

 


 

def solution(bandage, health, attacks):
    
    hp = health # 현재 체력
    count = 0 # 연속 성공
    
    attack_time = []
    attack_dic = {}
    
    # 공격 관련 저장
    for i in attacks:
        attack_time.append(i[0])      
        attack_dic[i[0]] = i[1]
    
    # 진행 시간
    for time in range(1,attacks[-1][0]):

        # 공격 
        if time in attack_time: 
            hp = hp - attack_dic[time]
            count = 0
            # hp 가 0 이하일 경우
            if hp <= 0 :
                return -1
        # 공격하지 않음
        else :
            if hp < health:
                
                # 기본 회복량
                hp = hp + bandage[1]
                count += 1
                
                # 연속회복이 조건을 만족할 경우
                if count == bandage[0] :
                    hp = hp + bandage[2]
                
                # 최대치를 넘을 경우
                if hp >= health:
                    hp = health
                    
    # 마지막 공격
    hp = hp - attacks[-1][1]
    # hp 가 0 이하일 경우
    if hp <= 0:
        return -1
    
    return hp

 

 

무언가 예외 케이스가 있다. 이런 경우가 제일 찾기 어렵다.. 

 


찾아보니 공격받지 않는 경우에서 로직에 문제가 있었다. 

 

def solution(bandage, health, attacks):
    
    hp = health # 현재 체력
    count = 0 # 연속 성공
    
    attack_time = []
    attack_dic = {}
    
    # 공격 관련 저장
    for i in attacks:
        attack_time.append(i[0])      
        attack_dic[i[0]] = i[1]
    
    # 진행 시간
    for time in range(1,attacks[-1][0]):

        # 공격 
        if time in attack_time: 
            hp = hp - attack_dic[time]
            count = 0
            # hp 가 0 이하일 경우
            if hp <= 0 :
                return -1
        # 공격하지 않음
        else :
            hp = hp + bandage[1]
            count += 1
            
            # 추가회복 조건
            if count == bandage[0] :
                hp = hp + bandage[2]
                count = 0
            
            # 최대치를 넘을 경우
            if hp >= health:
                hp = health
                
                
    # 마지막 공격
    hp = hp - attacks[-1][1]
    # hp 가 0 이하일 경우
    if hp <= 0:
        return -1
    else :
        return hp

'프로그래머스 > 1단계' 카테고리의 다른 글

29. 다트 게임  (1) 2024.01.22
28. 가장 많이 받은 선물  (0) 2024.01.22
26. 신고 결과 받기  (1) 2024.01.22
25. 공원 산책  (0) 2024.01.22
24. 달리기 경주  (0) 2024.01.22