728x90
https://school.programmers.co.kr/learn/courses/30/lessons/250137
본 포스팅에서 다루는 문제는 위 프로그래머스 링크를 통하여 문제 확인 및 풀이가 가능합니다!
1. 정답 코드
function solution(bandage, health, attacks) {
let currTime = 0; // 첫 시작 시간
let castingTime = bandage[0]; // 시전 시간
let healPerSec = bandage[1]; // 초당 회복량
let bonusHeal = bandage[2]; // 추가 회복량
let currHealth = health; // 현재 체력 <- 처음에는 최대 체력과 동일
while (attacks.length > 0) {
let attackTime = attacks[0][0];
let attackDamage = attacks[0][1];
let timeDiff = attackTime - currTime - 1;
currHealth += healPerSec * timeDiff // 기본 초당 회복
currHealth += parseInt(timeDiff / castingTime) * bonusHeal // 추가 회복
if (currHealth > health)
currHealth = health; // 최대 체력 이상 회복 불가능
currHealth -= attackDamage;
if (currHealth <= 0)
return -1; // 캐릭터 사망
attacks.shift();
currTime = attackTime;
}
return currHealth;
}
2. 문제 풀이
본 문제 역시 효율성 테스트 없이 정확성 테스트만 존재하기 때문에 시작 시간(0초)부터 마지막 공격의 시간까지 for, while 문 등의 반복문을 통하여 1초마다 공격 여부, 추가 회복 여부 등을 판단하여 코드를 작성하여 통과할 수 있습니다.
하지만 효율성 테스트가 존재하는 문제라면 마지막 공격의 시간 만큼의 반복이 요구됩니다. 만일 공격이 한 번밖에 없지만 마지막 공격 시간이 10,000이라면 10,000번의 반복이 필요하다고 볼 수 있습니다.
문제 자체에서 초 단위의 조건(연속 성공, 추가 회복량, 초당 회복량 등)들이 많이 나와 캐릭터의 체력을 초 단위로 관리해야 할 것 같지만 아래 두 가지 포인트에 집중하여 문제를 풀이하면 코드의 효율성을 개선할 수 있습니다.
1. 공격을 받는 경우가 아니라면 캐릭터는 죽지 않는다.
2. 공격을 받기 바로 전에 회복 관련 처리(초당 회복, 추가 회복, 최대 체력 초과 여부 판단)를 한꺼번에 진행해도 괜찮다.
위 코드의 작동 방식을 간단하게 나타내면 아래와 같습니다.
- 마지막으로 공격을 받은 시간(제일 초기에는 0초)와 그 다음 공격 시간의 시간 차이를 계산(timeDiff)
- 캐릭터 체력 회복을 먼저 진행
2.1. timeDiff * (초당 회복량) 만큼을 현재 체력에 더합니다.
2.2. timeDiff 동안 붕대 감기 기술을 시전 시간동안 온전히 성공시킨 횟수인 parseInt(timeDiff / (시전 시간))에 (추가 회복량) 만큼을 곱한 수치를 더합니다.
2.3. 현재 체력이 최대 체력을 넘은 경우, 현재 체력을 최대 체력으로 재할당합니다. - 현재 체력에서 피해량만큼의 체력을 차감합니다.
- 캐릭터가 죽은 경우에는 -1을 결과값으로 반환합니다.
- 캐릭터가 죽지 않은 경우 마지막으로 공격을 받은 시간을 갱신합니다.
위 다섯 가지의 절차를 attacks 배열의 length가 0이 될 때까지 반복하면 됩니다.
이를 통하여 우리는 마지막 공격의 시전 시간이 될 때까지 1초씩 증가시키며 반복하는 방식이 아닌, 공격 배열의 길이만큼만 반복을 진행하는 것으로 코드를 개선할 수 있습니다.
728x90
'알고리즘' 카테고리의 다른 글
[알고리즘] 2018 KAKAO BLIND RECRUITMENT - [JavaScript] [1차] 비밀지도 (0) | 2024.03.21 |
---|---|
[알고리즘] Summer/Winter Coding(~2018) - [JavaScript] 점프와 순간 이동 (4) | 2024.03.18 |
[알고리즘] Summer/Winter Coding(~2018) - [JavaScript] 스킬트리 (2) | 2024.03.07 |
[알고리즘] 프로그래머스 알고리즘 고득점 Kit - [JavaScript] 전화번호 목록 (0) | 2024.01.29 |
[알고리즘] 2018 KAKAO BLIND RECRUITMENT - [JavaScript] 캐시 (0) | 2024.01.25 |