본문 바로가기

개발/알고리즘

[프로그래머스] 붕대 감기 Python 문제 풀이

📘 문제

플랫폼: 프로그래머스
난이도: Lv1
유형: 시뮬레이션

 

🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/250137

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

시뮬레이션 문제로 몬스터의 공격 정보, 회복 정보 등이 주어졌을 때 몬스터의 공격과 회복량을 계산해서 마지막 체력을 return 하는 문제

 

🧠 접근 방법 및 풀이 과정

문제에 나온대로 시뮬레이션을 돌려가면서 풀었다.

 

1차 코드

for t in range(last_attack_time + 1):        
    # 쥬금
    if health <= 0:
        return -1

    # 공격 성공
    if t in attack_info:
        health -= attack_info[t]
        heal_cnt = 0            
        continue

    if health >= max_hp:
        continue

    # 회복
    heal_cnt += 1

    if heal_cnt == bandage[0]:
        health += bandage[2]

    health += bandage[1]
    if health > max_hp: health %= max_hp

 

10분 만에 쉽게 테케를 전부 맞춰서 '역시 레벨 1이라 쉽군' 했는데

제출했더니 우수수 틀림 ㅋ..

 

일단 1가지 오류

연속 회복을 성공한 뒤 카운트를 초기화 시켜줘야 했는데 안해줬다

이걸 고쳤더니 40점으로 올라감

 

"질문하기"에서 찾은 반례로 문제를 해결 할 수 있었다

 

입력값 〉 [5, 3, 2], 30, [[1, 1], [4, 12]]
기댓값 〉 18

 

원래 코드에선 아래와 같이 최대 체력을 넘으면 현재 체력과 최대 체력을 나눈 나머지값을 갖게 했는데 

 

if health > max_hp: health %= max_hp

 

그게 아니라 최대 체력을 넘으면 그냥 최대 체력을 가져야한다.

 

if health > max_hp: health = max_hp

 

이렇게 바꾸니까 정답됨

 

💻 코드 & 설명

from collections import defaultdict

def solution(bandage, health, attacks):
    max_hp = health 
    last_attack_time = attacks[-1][0]
    
    attack_info = defaultdict()
    
    for time, damage in attacks:
        attack_info[time] = damage
    
    heal_cnt = 0
    
    for t in range(last_attack_time + 1):        
        # 쥬금
        if health <= 0:
            return -1
        
        # 공격 성공
        if t in attack_info:
            health -= attack_info[t]
            heal_cnt = 0
            continue
        
        if health >= max_hp:
            continue
        
        # 회복
        heal_cnt += 1
        
        if heal_cnt == bandage[0]:
            health += bandage[2]
            heal_cnt = 0
        
        health += bandage[1]
        if health > max_hp: health = max_hp
    
    return health if health > 0 else -1

 

 

✨ 회고 / 느낀 점

평소에 주석을 좋아하지 않는 편인데.. 시뮬레이션 문제에선 주석을 다는 것이 훨씬 편하다는 것을 느꼈다.

연습할 땐 "질문하기" 같은 도움 받을 수 있는 통로가 있지만 실전에선 없으니까 조건을 더 꼼꼼히 보고 혼자 문제를 해결하는 연습을 해야겠다

 

💭 요즘 문제 풀고 다른 사람 풀이 보는 것에 재미 들렸는데 이번 문제에서 좀 웃겼다 ㅋㅋㅋㅋ 엄준식씨 누구세요..?

그리고 12줄 만에 푼 사람도 있었는데 댓글에 "와 난 진짜 멍청이야..."라는 댓글이 있어서 나도 달았다

지금은 부끄러워서 지웠어요🙈

 

 

 

 

 

 

요즘 알고리즘 문제 푼 글에 여자 캐릭터 사진을 넣었는데 오늘은 귀여운 쿼카를 그려보았어요 🐨

디저트는 대리 만족을 위해 항상 넣는 편,,🫶🏻