본문 바로가기

CodingTest

[PCCP 기출문제] 1번 / 붕대 감기

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

 

프로그래머스

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

programmers.co.kr

 

개요

공격 및 치유 여부에 따라 체력의 증감을 반영하여, 공격이 끝난 다음 최종적으로 남는 체력을 구하는 문제이다 

 

 

알고리즘

1. 현재 체력과 추가회복 쿨타임을 변수에 저장한다.

 

 

2. 마지막 공격이 들어오는 시간까지, 현재의 체력 상태 및 쿨타임을 1초 단위로 갱신한다.

 

    1) 공격이 들어온다면 회복 쿨타임을 초기화하고, 체력을 공격력만큼 깎는다.

        체력이 0 이하가 되면 -1을 반환한다.

 

    2) 공격이 없다면 체력을 회복하고, 쿨타임이 찼다면 추가회복량 만큼 체력을 더 올려준다.

         회복한 후의 체력이 주어진 최대 체력을 넘어가면, 주어진 최대 체력으로 체력의 값을 변경해준다

 

3. 여기까지 왔다면, 잔존 체력을 반환한다.

 

 

풀이

1.  쿨타임과 현재 체력, 공격 정보를 변수에 담아준다.

ans = health    # 현재 체력
que = deque()   # 공격 정보
cool_time = bandage[0]   # 추가회복 쿨타임

for i in range(len(attacks)):
    que.append(attacks[i])    # 공격 정보를 que에 담음
                              # 공격이 있을 때마다, que의 맨 앞 요소를 pop 한다

 

 

2. 시각에 따라 공격 및 회복 등의 변동사항을 현재 체력에 반영한다

for i in range(1, attacks[-1][0] + 1):  # 공격이 끝나는 시각까지 체크
    # i: 현재 시각
    
    if que[0][0] == i:             # 현재 시각이 공격이 들어오는 시각일 경우
        x = que.popleft()          # 공격 정보 획득
        ans -= x[1]                # 현재 체력에서 공격력 x[1] 만큼 빼기
        cool_time = bandage[0]     # 쿨타임 초기화

        if ans <= 0:         # 체력이 0 이하가 되는 경우
            return -1        # -1 반환

    else:                          # 공격이 들어오지 않는 시각
        ans += bandage[1]          # 1초 마다 bandage[1]만큼 체력 회복
        cool_time -= 1             # 쿨타임 1초 감소

        if cool_time == 0:            # 쿨타임 다 찬 경우
            ans += bandage[2]         # 추가 회복량만큼 체력 회복
            cool_time = bandage[0]    # 쿨타임 초기화

        ans = min(ans, health)      # 현재 체력 ans는 주어진 최대 체력 health를 넘어갈 수 없음
        
return ans     # 현재까지 남은 체력 반환

 

1) 만약 공격이 들어오는 시각이라면?

 

들어오는 공격에 대한 정보를 que에서 빼와서, 잔여 체력에서 공격력만큼 뺀다. 

추가 회복 쿨타임은 초기화 하고, 체력이 0 이하로 떨어지면 바로 -1을 반환한다.

 

 

2) 공격이 들어오지 않는다면?

 

bandage[1] 만큼 체력을 회복하고, 추가회복 쿨타임을 1초 빼준다.

쿨타임이 0이면, bandage[2] 만큼 체력을 회복하고, 쿨타임은 bandage[0]으로 초기화 한다.

 

현재 체력은 주어진 최대 체력 health, 현재 체력 중 최솟값으로 변경한다.

이는 현재 체력이 주어진 한계치 health를 넘어가는 것을 막기 위함이다.

 

 

3. 잔존 체력 반환

여기까지 왔다면, 남아있는 체력 ans를 반환한다.

 

 

코드

from collections import deque


def solution(bandage, health, attacks):
    ans = health    # 현재 체력
    que = deque()   # 공격 정보
    cool_time = bandage[0]   # 추가회복 쿨타임

    for i in range(len(attacks)):
        que.append(attacks[i])    # 공격 정보를 que에 담음
                                  # 공격이 있을 때마다, que의 맨 앞 요소를 pop 한다
        
    for i in range(1, attacks[-1][0] + 1):  # 공격이 끝나는 시각까지 체크
        # i: 현재 시각

        if que[0][0] == i:             # 현재 시각이 공격이 들어오는 시각일 경우
            x = que.popleft()          # 공격 정보 획득
            ans -= x[1]                # 현재 체력에서 공격력 x[1] 만큼 빼기
            cool_time = bandage[0]     # 쿨타임 초기화

            if ans <= 0:         # 체력이 0 이하가 되는 경우
                return -1        # -1 반환

        else:                          # 공격이 들어오지 않는 시각
            ans += bandage[1]          # 1초 마다 bandage[1]만큼 체력 회복
            cool_time -= 1             # 쿨타임 1초 감소

            if cool_time == 0:            # 쿨타임 다 찬 경우
                ans += bandage[2]         # 추가 회복량만큼 체력 회복
                cool_time = bandage[0]    # 쿨타임 초기화

            ans = min(ans, health)      # 현재 체력 ans는 주어진 최대 체력 health를 넘어갈 수 없음

    return ans     # 현재까지 남은 체력 반환

 

 

채점 결과

'CodingTest' 카테고리의 다른 글

연속된 부분 수열의 합  (1) 2024.03.27
이웃한 칸  (1) 2024.03.21
과제 진행하기  (0) 2024.03.16
[PCCP 기출문제] 2번 / 석유 시추  (0) 2024.03.05
[PCCE 모의고사] 10번 문제풀이  (0) 2024.02.19