본문 바로가기

Algorithm/프로그래머스

[프로그래머스/Python] PCCP 기출문제 1번 - 붕대 감기

 문제
 

PCCP 기출문제 1번 - 붕대 감기

 

 

 

풀이

 

💡 입력들의 범위를 살펴보자

 

전반적으로 숫자 범위가 작으니 구현에만 집중해도 될 것 같다는 생각이 들었다.

구현 문제는 오랜만이라... 한 시간 안에 풀려고 노력했다.

 

 

처음에는 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