문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
정답
function solution(bandage, health, attacks) {
const maxHealth = health;
const totalSeconds = attacks[attacks.length - 1][0];
const attacksArr = new Array(attacks.length).fill(0);
attacks.forEach(attack => {
const seconds = attack[0];
const damages = attack[1];
attacksArr[seconds] = damages;
});
let SucessSequence = 0;
// 총 시간 만큼 반복문을 돌린다
for (let i = 0; i <= totalSeconds; i++) {
const SuccessSequenceTarget = bandage[0];
const HealperSeconds = bandage[1];
const BonusHeal = bandage[2];
// 공격당하는 경우:
// 현재 체력에서 피해량 만큼을 깎는다
// 연속 성공 카운트는 0으로 초기화된다
// 공격당하지 않는 경우:
// 현재 체력에서 최대 체력까지만 초당 회복량 만큼을 올린다
// 연속 성공 카운트가 1 증가된다
if (attacksArr[i] > 0) {
health -= attacksArr[i];
if (health <= 0) {
break;
}
SucessSequence = 0;
} else {
// 현재 체력에 초당 회복량을 더한 값이 최대 체력보다 작거나 같은 경우:
// 현재 체력에 초당 회복량을 더한다
// 그렇지 않은 경우:
// 현재 체력을 최대 체력으로 바꾼다
if (health + HealperSeconds <= maxHealth) {
health += HealperSeconds;
} else {
health = maxHealth;
}
if (i > 0) {
SucessSequence += 1;
}
}
// 연속 성공 카운트가 목표 값에 도달하는 경우:
// 연속 성공 카운트를 0으로 돌린다
// 현재 체력에 보너스 체력을 더한 값이 최대 체력보다 작거나 같은 경우:
// 현재 체력에 보너스 체력을 더한다
// 그렇지 않은 경우:
// 현재 체력을 최대 체력으로 바꾼다
if (SucessSequence === SuccessSequenceTarget) {
SucessSequence = 0;
if (health + BonusHeal <= maxHealth) {
health = health + BonusHeal;
} else {
health = maxHealth;
}
}
if (health <= 0) {
break;
}
}
return health <= 0 ? -1 : health;
}