일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래머스
- mock date
- 자바스크립트
- 테스트 Date
- 귤 고르기
- 구름톤챌린지
- 과제 진행하기
- 연결 요소 제거하기
- mutationobserver
- 통신망분석
- 리액트네이티브 엔진
- Hermes Engine
- 날짜 테스트
- 헤르메스 엔진
- 호텔 대실
- Google 애널리틱스
- Leetcode #javascript #알고리즘 #Algorithms #js
- 최솟갑 구하기
- Jest uuid syntax
- jest
- JavaScript
- ResizeObserver
- nextjs
- 리액트네이티브
- 중첩 점
- 구름톤 챌린지
- nextjs-performance
- 구름톤
- create-next-app
- 테이블 해시 함수
- Today
- Total
나만보는개발공부블로그
[프로그래머스] 붕대 감기 본문
문제 설명
어떤 게임에는 붕대 감기라는 기술이 있습니다.
붕대 감기는 t초 동안 붕대를 감으면서 1초마다 x만큼의 체력을 회복합니다. t초 연속으로 붕대를 감는 데 성공한다면 y만큼의 체력을 추가로 회복합니다. 게임 캐릭터에는 최대 체력이 존재해 현재 체력이 최대 체력보다 커지는 것은 불가능합니다.
기술을 쓰는 도중 몬스터에게 공격을 당하면 기술이 취소되고, 공격을 당하는 순간에는 체력을 회복할 수 없습니다. 몬스터에게 공격당해 기술이 취소당하거나 기술이 끝나면 그 즉시 붕대 감기를 다시 사용하며, 연속 성공 시간이 0으로 초기화됩니다.
몬스터의 공격을 받으면 정해진 피해량만큼 현재 체력이 줄어듭니다. 이때, 현재 체력이 0 이하가 되면 캐릭터가 죽으며 더 이상 체력을 회복할 수 없습니다.
당신은 붕대감기 기술의 정보, 캐릭터가 가진 최대 체력과 몬스터의 공격 패턴이 주어질 때 캐릭터가 끝까지 생존할 수 있는지 궁금합니다.
붕대 감기 기술의 시전 시간, 1초당 회복량, 추가 회복량을 담은 1차원 정수 배열 bandage와 최대 체력을 의미하는 정수 health, 몬스터의 공격 시간과 피해량을 담은 2차원 정수 배열 attacks가 매개변수로 주어집니다. 모든 공격이 끝난 직후 남은 체력을 return 하도록 solution 함수를 완성해 주세요. 만약 몬스터의 공격을 받고 캐릭터의 체력이 0 이하가 되어 죽는다면 -1을 return 해주세요.
문제 설명
문제의 설명대로 회복시간과 공격당한순간을 비교해가며 최근 체력을 찾아가면 되는데 맨 처음 공격당하기 전에는 무조건 현재 체력이 유지되기때문에 공격당하고 난 두번째부터 반복문으로 처리해서 최근 체력을 찾아갔다.
previousTime을 통해서 첫번째 공격당한 시간과 두번쨰 공격당한 시간동안 체력을 회복할 수 있는 기간이라고 생각해서 previousTime을 통해서 붕대회복 * 공격당한 시간 사이의 시간만큼 체력을 회복시켜주고 그뒤에 damage를 받은 경우로 처리해준다.
previousTime에 -1을 추가해준 경우는 몬스터의 공격받은 시간에는 회복을 못하기때문이다.
그리고 테스트 케이스 14번에서 실패가 떳는데 만약에 공격받은 시간의 텀이 엄청 길다면 붕대시간을 완료하고 추가적으로 받는 회복이 초기화 되면서 여러번 추가적으로 회복받을수있기때문에 successTime으로 몇번이나 추가적으로 회복받을 수 있는지 추가해서 통과하였다.
자바스크립트 코드
function solution(bandage, health, attacks) {
const [healTime, healthPerSec, additonalHealth] = bandage;
let curTime = attacks[0][0];
let curHealth = health - attacks[0][1];
for(let i = 1; i < attacks.length; ++i){
const [attackTime, damage] = attacks[i];
let previousTime = attackTime - attacks[i-1][0] - 1;
let successTime = Math.floor(previousTime / healTime);
if (previousTime < healTime) {
curHealth += healthPerSec * previousTime;
} else {
curHealth += (additonalHealth * successTime) + (healthPerSec * previousTime);
}
if(curHealth >= health) {
curHealth = health;
}
curHealth -= damage;
curTime += previousTime;
if(curHealth <= 0) return -1;
}
return curHealth
}
'Algorithms' 카테고리의 다른 글
[프로그래머스] 석유 시추 (1) | 2023.12.03 |
---|---|
[프로그래머스] 전력망을 둘로 나누기 (0) | 2023.11.11 |
[프로그래머스] 배달 (1) | 2023.10.30 |
[프로그래머스] 괄호변환 (1) | 2023.10.16 |
[프로그래머스] 주차 요금 계산 (0) | 2023.10.12 |