[level 1] [PCCP 기출문제] 1번 / 붕대 감기 - 250137
성능 요약
메모리: 10.1 MB, 시간: 0.23 ms
구분
코딩테스트 연습 > PCCP 기출문제
채점결과
정확성: 100.0
합계: 100.0 / 100.0
제출 일자
2024년 1월 4일 23:25:49
문제 설명
어떤 게임에는 붕대 감기
라는 기술이 있습니다.
붕대 감기
는 t
초 동안 붕대를 감으면서 1초마다 x
만큼의 체력을 회복합니다. t
초 연속으로 붕대를 감는 데 성공한다면 y
만큼의 체력을 추가로 회복합니다. 게임 캐릭터에는 최대 체력이 존재해 현재 체력이 최대 체력보다 커지는 것은 불가능합니다.
기술을 쓰는 도중 몬스터에게 공격을 당하면 기술이 취소되고, 공격을 당하는 순간에는 체력을 회복할 수 없습니다. 몬스터에게 공격당해 기술이 취소당하거나 기술이 끝나면 그 즉시 붕대 감기
를 다시 사용하며, 연속 성공 시간이 0으로 초기화됩니다.
몬스터의 공격을 받으면 정해진 피해량만큼 현재 체력이 줄어듭니다. 이때, 현재 체력이 0 이하가 되면 캐릭터가 죽으며 더 이상 체력을 회복할 수 없습니다.
당신은 붕대감기
기술의 정보, 캐릭터가 가진 최대 체력과 몬스터의 공격 패턴이 주어질 때 캐릭터가 끝까지 생존할 수 있는지 궁금합니다.
붕대 감기
기술의 시전 시간, 1초당 회복량, 추가 회복량을 담은 1차원 정수 배열 bandage
와 최대 체력을 의미하는 정수 health
, 몬스터의 공격 시간과 피해량을 담은 2차원 정수 배열 attacks
가 매개변수로 주어집니다. 모든 공격이 끝난 직후 남은 체력을 return 하도록 solution 함수를 완성해 주세요. 만약 몬스터의 공격을 받고 캐릭터의 체력이 0 이하가 되어 죽는다면 -1을 return 해주세요.
제한사항
bandage
는 [시전 시간
,초당 회복량
,추가 회복량
] 형태의 길이가 3인 정수 배열입니다.- 1 ≤
시전 시간
=t
≤ 50 - 1 ≤
초당 회복량
=x
≤ 100 - 1 ≤
추가 회복량
=y
≤ 100
- 1 ≤
- 1 ≤
health
≤ 1,000 - 1 ≤
attacks
의 길이 ≤ 100attacks[i]
는 [공격 시간
,피해량
] 형태의 길이가 2인 정수 배열입니다.attacks
는공격 시간
을 기준으로 오름차순 정렬된 상태입니다.attacks
의공격 시간
은 모두 다릅니다.- 1 ≤
공격 시간
≤ 1,000 - 1 ≤
피해량
≤ 100
입출력 예
bandage | health | attacks | result |
---|---|---|---|
[5, 1, 5] | 30 | [[2, 10], [9, 15], [10, 5], [11, 5]] | 5 |
[3, 2, 7] | 20 | [[1, 15], [5, 16], [8, 6]] | -1 |
[4, 2, 7] | 20 | [[1, 15], [5, 16], [8, 6]] | -1 |
[1, 1, 1] | 5 | [[1, 2], [3, 2]] | 3 |
입출력 예 설명
입출력 예 #1
몬스터의 마지막 공격은 11초에 이루어집니다. 0초부터 11초까지 캐릭터의 상태는 아래 표와 같습니다.
시간 | 현재 체력(변화량) | 연속 성공 | 공격 | 설명 |
---|---|---|---|---|
0 | 30 | 0 | X | 초기 상태 |
1 | 30(+0) | 1 | X | 최대 체력 이상의 체력을 가질 수 없습니다. |
2 | 20(-10) | 0 | O | 몬스터의 공격으로 연속 성공이 초기화됩니다. |
3 | 21(+1) | 1 | X | |
4 | 22(+1) | 2 | X | |
5 | 23(+1) | 3 | X | |
6 | 24(+1) | 4 | X | |
7 | 30(+6) | 5 → 0 | X | 5초 연속 성공해 체력을 5만큼 추가 회복하고 연속 성공이 초기화됩니다. |
8 | 30(+0) | 1 | X | 최대 체력 이상의 체력을 가질 수 없습니다. |
9 | 15(-15) | 0 | O | 몬스터의 공격으로 연속 성공이 초기화됩니다. |
10 | 10(-5) | 0 | O | 몬스터의 공격으로 연속 성공이 초기화됩니다. |
11 | 5(-5) | 0 | O | 몬스터의 마지막 공격입니다. |
몬스터의 마지막 공격 직후 캐릭터의 체력은 5입니다. 따라서 5
을 return 해야 합니다.
입출력 예 #2
몬스터의 마지막 공격은 8초에 이루어집니다. 0초부터 8초까지 캐릭터의 상태는 아래 표와 같습니다.
시간 | 현재 체력(변화량) | 연속 성공 | 공격 | 설명 |
---|---|---|---|---|
0 | 20 | 0 | X | 초기 상태 |
1 | 5(-15) | 0 | O | 몬스터의 공격으로 연속 성공이 초기화됩니다. |
2 | 7(+2) | 1 | X | |
3 | 9(+2) | 2 | X | |
4 | 18(+9) | 3 → 0 | X | 3초 연속 성공해 체력을 7만큼 추가 회복하고 연속 성공이 초기화됩니다. |
5 | 2(-16) | 0 | O | 몬스터의 공격으로 연속 성공이 초기화됩니다. |
6 | 4(+2) | 1 | X | |
7 | 6(+2) | 2 | X | |
8 | 0(-6) | 0 | O | 몬스터의 마지막 공격을 받아 캐릭터의 체력이 0 이하가 됩니다. |
몬스터의 공격을 받아 캐릭터의 체력이 0 이하가 됩니다. 따라서 -1
을 return 해야 합니다.
입출력 예 #3
몬스터의 마지막 공격은 8초에 이루어집니다. 0초부터 5초까지 캐릭터의 상태는 아래 표와 같습니다.
시간 | 현재 체력(변화량) | 연속 성공 | 공격 | 설명 |
---|---|---|---|---|
0 | 20 | 0 | X | 초기 상태 |
1 | 5(-15) | 0 | O | 몬스터의 공격으로 연속 성공이 초기화됩니다. |
2 | 7(+2) | 1 | X | |
3 | 9(+2) | 2 | X | |
4 | 11(+2) | 3 | X | |
5 | -5(-16) | 0 | O | 몬스터의 공격을 받아 캐릭터의 체력이 0 이하가 됩니다. |
몬스터의 공격을 받아 캐릭터의 체력이 0 이하가 됩니다. 따라서 -1
을 return 해야 합니다.
입출력 예 #4
몬스터의 마지막 공격은 3초에 이루어집니다. 0초부터 3초까지 캐릭터의 상태는 아래 표와 같습니다.
시간 | 현재 체력(변화량) | 연속 성공 | 공격 | 설명 |
---|---|---|---|---|
0 | 5 | 0 | X | 초기 상태 |
1 | 3(-2) | 0 | O | 몬스터의 공격으로 연속 성공이 초기화됩니다. |
2 | 5(+2) | 1 → 0 | X | 1초 연속 성공해 체력을 1만큼 추가 회복하고 연속 성공이 초기화됩니다. |
3 | 3(-2) | 0 | O | 몬스터의 마지막 공격입니다. |
몬스터의 마지막 공격 직후 캐릭터의 체력은 3입니다. 따라서 3
을 return 해야 합니다.
풀이
def solution(bandage, health, attacks):
time = max(attacks)[0]
consecutive_heal = 0
max_health = health
heal = bandage[1]
additioinal_heal = bandage[2]
attacks = sorted(attacks, reverse=True)
for t in range(1, time+1):
if t != attacks[-1][0]:
if health + heal >= max_health:
health = max_health
consecutive_heal += 1
else:
health += heal
consecutive_heal += 1
if consecutive_heal == bandage[0]:
health += additioinal_heal
consecutive_heal = 0
if t == attacks[-1][0]:
health -= attacks[-1][1]
if health <= 0:
return -1
attacks.pop()
consecutive_heal = 0
return health
느낀점
해당 문제는 공격을 받을 때는 치료스킬이 취소된다는 점이다. 따라서 붕대를 감는 것 보다 공격을 먼저 받는지 확인을 한 뒤에 공격을 받지 않으면 붕대감기를 사용하고 공격을 받으면 해당 공격력 만큼 체력을 감소시키고 0 이하가 되면 -1을 return 하면 된다. 공격을 받지 않는 경우에는 최대체력을 넘지 않기 위해서 현재 체력과 붕대 체력을 더했을 때 최대체력보다 크면, 현재 체력은 최대체력이 되고 연속성공을 1만큼 증가시킨다. 만약 최대체력을 넘지 않는다면 체력을 주어진만큼 증가시키고 연속성공을 1만큼 증가시킨다. 이후 과정에서는 연속성공이 주어진 수와 똑같을 때 추가적인 체력회복을 더해주면 된다.
이번 문제는 크게 어렵지 않게 공격을 받는지 받지 않는지만 잘 사용한다면 쉽게 풀 수 있는 문제였다고 생각한다.
출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
'알고리즘' 카테고리의 다른 글
프로그래머스: 최댓값과 최솟값 (0) | 2024.01.27 |
---|---|
프로그래머스: 가장 많이 받은 선물 (1) | 2024.01.26 |
프로그래머스: 신고 결과 받기 (0) | 2024.01.23 |
프로그래머스: 공원 산책 (1) | 2024.01.23 |
프로그래머스: 개인정보 수집 유효기간 (0) | 2024.01.23 |