본문 바로가기
Algorithm/구현

[프로그래머스 lv 1] PCCP 기출 1번 붕대감기

by HANNI하니 2023. 12. 4.

사용 언어 - Python3

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

https://school.programmers.co.kr/learn/courses/19344/lessons/242258

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

정답

구현

각 단계별 체력을 status 리스트에 저장하기

0. 시간은 1초부터 attack[-1][0] 초까지

1. 초기 체력 = health, 시전시간 count 해줄 cnt = 0

2. 공격시간과 피해량을 attack_list에 저장해주기

3.1. 공격 받았다면, 

이전상태에서 피해량 빼주기 status[i] = status[i-1] - attack_list[i]

시전시간 초기화 cnt = 0

몬스터 공격받고 체력이 0이하가 되어 죽는다면 -1을 return if status[i] <= 0: return -1

3.2. 공격받지 않았다면,

status[i] = min(health, status[i-1]+bandage[1]) 초당회복량 더해주기

시전시간 도달시,

시전시간 초기화 cnt = 0

status[i] = min(health, status[i]+bandage[2]) 추가회복량 더해주기

4. return status[-1]

 

def solution(bandage, health, attacks):
    max_len = attacks[-1][0] # 최대 시간

    status = [0] * (max_len+1) # 각 단계별 체력
    status[0] = health # 체력은 health에서 시작
    cnt = 0 # 시전시간 count
    
    # 공격시간, 피해량
    attack_list = [0]*(max_len+1)    
    for a,b in attacks:
        attack_list[a] = b 
    
    for i in range(1,max_len+1): # i초
        if attack_list[i] != 0: # 공격 O
            status[i] = status[i-1] - attack_list[i] # 이전 상태에서 피해량 빼주기
            cnt = 0 # 시전시간 초기화
            if status[i] <= 0:
                return -1
            
        else: #공격 X
            # health를 넘어가면 안되기 때문에 min(health) 해주기!!            
            status[i] = min(health, status[i-1] + bandage[1])
            cnt += 1
            if cnt == bandage[0]: # 시전시간 도달시
                status[i] = min(health, status[i]+bandage[2]) # 추가회복량 더해주기
                cnt = 0 # 시전시간 초기화

    if status[-1] <= 0:
        return -1
    else:
        return status[-1]

 

 

내가 시도했던 방법

테스트케이스에선 모두 합격했으나, 큰 오점이 있었다!

1. 이전의 체력에서 공격력을 빼주거나 초당 회복량을 더해주는 경우 AND 현재의 체력에서 추가 회복량을 더해주는 경우

이전과 현재의 체력 모두를 알아야 하기 때문에 list형태로 저장해줘야 한다.

2. 각각의 공격마다 0이하로 체력이 떨어지면 바로 return -1을 해줘야한다.

 

좋은 아이디어라고 생각했던 부분!

1. attack_list 라는 0으로 이루어진 리스트를 생성하여, 각 시간당 공격량을 저장해준다면

굳이 for문을 불필요하게 돌릴 필요 없이, 전체 시간마다 해당 시간에 공격이 있었는지 여부만 판단하면 된다.

# 내 풀이 - 오답
def solution(bandage, health, attacks):    
    count = 0 # 시전시간 count
    answer = health # 체력 업데이트
     
    for i in range(1,attacks[-1][0]+1):
        count += 1
        for j in range(len(attacks)):
            if i != attacks[j][0]: # 공격 X
                continue
            else: # 공격 O
                count = 0
                answer -= attacks[j][1]
                answer -= bandage[1]

        if answer < health:
            answer += bandage[1]
        if count == bandage[0]:
            count = 0
            answer += bandage[2]

    if answer > 0:
        return answer
    return -1

 

 

레퍼런스

  • 깃허브 정답

댓글