Algorithm/Implementation

[프로그래머스 PCCP 모의고사 2-1번] 붕대 감기

킹우현 2023. 11. 18. 13:22

def solution(bandage, health, attacks):
    # 1초마다 x 만큼 체력회복
    # t초 동안 연속으로 붕대를 감는데 성공하면 y만큼의 체력을 추가로 회복

    # 최대 체력 보다 체력이 커지는건 X

    # 몬스터에게 공격을 당하거나 기술이 끝나면 '붕대 감기' 재시전 + 연속 성공시간 0초기화

    # 체력이 0 이하가 되면 캐릭터 사망 후 회복 X
    # 만약에 공격받고 죽으면 -1 리턴

    # 입력 : 붕대감기 기술정보(시전 시간, 1초당 회복량, 추가 회복량), 최대 체력, 몬스터의 공격 패턴
    # 출력 : 모든 공격을 받고 난 후 남은 체력

    max_time = attacks[-1][0] # 몬스터의 마지막 공격시간

    attack_list = [0]*(max_time+1) # 공격 목록을 리스트화

    for time, dam in attacks:
        attack_list[time] = dam
    
    heal_time = bandage[0] # 회복 진행 시간
    sec_heal = bandage[1] # 초당 회복량
    bonus_heal = bandage[2] # 추가 회복량
    
    current = health # 실시간 체력

    time = 0 # 시간
    contin = 0 # 연속 성공 시간

    while current > 0 and time < (max_time+1):
        if attack_list[time] != 0: # 공격당하는 경우
            current -= attack_list[time] # 현재 체력 - 데미지
            contin = 0 # 연속 성공 시간 0 초기화

        else: # 공격 당하지 않는 경우
            current += sec_heal # 초당 회복
            contin += 1 # 연속 성공 시간 + 1

            if contin == heal_time: # 연속으로 붕대를 감는데 성공하면 추가 회복
                current += bonus_heal # 추가 회복
                contin = 0 # 연속 성공 시간 0 초기화
            
            if current > health: # 최대 체력보다 체력이 높아질 수는 없음
                current = health
        
        time += 1
    
    if current <= 0:
        return -1
    else:
        return current

 

이번 문제는 최대 체력과 붕대 감기 스킬 정보(시전 시간 / 초당 회복량 / 추가 회복량), 몬스터의 공격 정보 총 3가지 정보가 주어졌을 때 몬스터의 공격이 끝나고 난 후에 남은 체력을 반환하는 문제이다.

 

time 이라는 변수를 설정하여 매 초마다 공격을 받는 경우 공격을 받지 않고 회복하는 경우를 구분하여 구현할 수 있었던 문제였다 :)

'Algorithm > Implementation' 카테고리의 다른 글

[백준 16918번] 봄버맨  (1) 2024.01.04
[백준 15721번] 번데기  (1) 2023.12.28
[프로그래머스 PCCP 모의고사 1번] 실습용 로봇  (0) 2023.11.11
[백준 7682번] 틱택토  (0) 2023.10.20
[백준 2578번] 빙고  (0) 2023.10.06