문제 설명
어떤 게임에는 붕대 감기라는 기술이 있습니다.
붕대 감기는 t초 동안 붕대를 감으면서 1초마다 x만큼의 체력을 회복합니다. t초 연속으로 붕대를 감는 데 성공한다면 y만큼의 체력을 추가로 회복합니다. 게임 캐릭터에는 최대 체력이 존재해 현재 체력이 최대 체력보다 커지는 것은 불가능합니다.
기술을 쓰는 도중 몬스터에게 공격을 당하면 기술이 취소되고, 공격을 당하는 순간에는 체력을 회복할 수 없습니다. 몬스터에게 공격당해 기술이 취소당하거나 기술이 끝나면 그 즉시 붕대 감기를 다시 사용하며, 연속 성공 시간이 0으로 초기화됩니다.
몬스터의 공격을 받으면 정해진 피해량만큼 현재 체력이 줄어듭니다. 이때, 현재 체력이 0 이하가 되면 캐릭터가 죽으며 더 이상 체력을 회복할 수 없습니다.
당신은 붕대감기 기술의 정보, 캐릭터가 가진 최대 체력과 몬스터의 공격 패턴이 주어질 때 캐릭터가 끝까지 생존할 수 있는지 궁금합니다.
붕대 감기 기술의 시전 시간, 1초당 회복량, 추가 회복량을 담은 1차원 정수 배열 bandage와 최대 체력을 의미하는 정수 health, 몬스터의 공격 시간과 피해량을 담은 2차원 정수 배열 attacks가 매개변수로 주어집니다. 모든 공격이 끝난 직후 남은 체력을 return 하도록 solution 함수를 완성해 주세요. 만약 몬스터의 공격을 받고 캐릭터의 체력이 0 이하가 되어 죽는다면 -1을 return 해주세요.
1 ≤ 시전 시간 = t ≤ 501 ≤ 초당 회복량 = x ≤ 1001 ≤ 추가 회복량 = y ≤ 1001 ≤ health ≤ 1,0001 ≤ attacks의 길이 ≤ 1001 ≤ 공격 시간 ≤ 1,0001 ≤ 피해량 ≤ 100
링크 참고 https://school.programmers.co.kr/learn/courses/30/lessons/250137
변수명을 한글로 해서 풀었다.
처음에는 let i로 1초부터 마지막 공격시간초까지 돌리고
attacks 배열을 let j 반복으로 돌렸는데
그러면 중복계산되어서 틀린 결과가 나왔다.
결국 맵 객체를 선언해서 꺼내쓰는걸로 수정했더니 성공했다!
function solution(bandage, health, attacks) {
const 공격마지막 = attacks[attacks.length-1]
const 마지막공격시간 = 공격마지막[0]
let 공격받은후체력 = health;
let 연속카운트 = 0;
// 맵객체 선언
const 공격시간맵 = new Map();
attacks.forEach((item)=>{
const [공격시간, 피해량] = item;
공격시간맵.set(공격시간,피해량)
})
// 1초부터 마지막 공격시간까지 반복
for(let i = 1; i <= 마지막공격시간; i++) {
// 공격이 있을 때
if(공격시간맵.get(i)){
공격받은후체력 -= 공격시간맵.get(i);
연속카운트 = 0;
if(공격받은후체력 <= 0){
return -1;
}
}
// 공격이 없을 때
else {
공격받은후체력 = Math.min(health, 공격받은후체력+bandage[1]);
연속카운트 ++;
if(연속카운트 === bandage[0]){
공격받은후체력 = Math.min(health, 공격받은후체력+bandage[2]);
연속카운트 = 0;
}
}
}
return 공격받은후체력;
}

function solution(bandage, health, attacks) {
const lastAttack = attacks[attacks.length-1]
const lastAttackTime = lastAttack[0]
let currentHelath = health;
let healCount = 0;
const attackTimeMap = new Map();
attacks.forEach((item)=>{
const [attackTime, damage] = item;
attackTimeMap.set(attackTime,damage)
})
for(let i = 1; i <= lastAttackTime; i++) {
if(attackTimeMap.get(i)){
currentHelath -= attackTimeMap.get(i);
healCount = 0;
if(currentHelath <= 0){
return -1;
}
} else {
currentHelath = Math.min(health, currentHelath+bandage[1]);
healCount ++;
if(healCount === bandage[0]){
currentHelath = Math.min(health, currentHelath+bandage[2]);
healCount = 0;
}
}
}
return currentHelath;
}
점점 푸는 속도는 좀 올라가 것 같은데
아직까지는 바로바로 구조가 안나온다
문제 파악하는데도 시간이 걸리고..
빨리 스무스하게 풀 수 있는 날이 오길 ..