주어진 시간동안 공격과 회복을 하면서 최종적으로 남은 체력을 리턴하는 문제이다.
같이 고려해야할 조건이 많기 때문에 꼼꼼히 문제를 읽어봐야 한다.
1. 마지막 공격 시간까지 반복문을 돌려야한다.
2. 연속 공격의 횟수를 count하여 시전시간이 되었을 때 추가 회복량을 더해줘야한다. 이때 공격 성공 시에는 초당 회복량을 더해줘야한다.
3. 주어진 health보다 그 이상이 될 순없다.
이중 반복문을 돌려야 하나 라고 고민했지만 그러기엔 조건문이 너무 남발하게 될 것 같았다.
그래서 먼저 공격에 대한 배열을 Map 형식에 저장하여 key, value로 조회해야 겠다고 생각했다.
// Map에 저장하여 key와 value로 조회
for (int[] attack : attacks) {
attackInfo.put(attack[0], attack[1]);
}
이렇게 하면 공격을 받았을 때 그 키값의 피해량만 가져와 체력에서 빼주면 되기 때문에 반복문을 한번만 돌려도 된다.
동일 키가 존재하는 지 체크는 containsKey() 메소드를 통해서 true인 경우를 확인하면 된다.
if (attackInfo.containsKey(i)) {}
나머지 조건은 조건문을 통해서 추가해주면 된다.
최종 코드이다.
import java.util.*;
class Solution {
public int solution(int[] bandage, int health, int[][] attacks) {
Map<Integer, Integer> attackInfo = new HashMap<>();
int curHealth = health;
int successTime = 0;
// Map에 저장하여 key와 value로 조회
for (int[] attack : attacks) {
attackInfo.put(attack[0], attack[1]);
}
for (int i = 1; i <= attacks[attacks.length-1][0]; i++) {
// 공격이 있다면
if (attackInfo.containsKey(i)) {
curHealth -= attackInfo.get(i);
successTime = 0;
}
// 공격이 없다면
else {
curHealth += bandage[1];
successTime++;
if (successTime == bandage[0]) {
curHealth += bandage[2];
successTime = 0;
}
if (curHealth > health) {
curHealth = health;
}
}
if (curHealth <= 0) {
return -1;
}
}
return curHealth;
}
}
'[JAVA]' 카테고리의 다른 글
[프로그래머스 JAVA] 배열의 평균 (0) | 2024.06.20 |
---|---|
[프로그래머스 JAVA] 정수 부분 (0) | 2024.06.19 |
[프로그래머스 JAVA] k진수에서 소수 개수 구하기 문제 풀이 (0) | 2023.12.02 |
[프로그래머스 JAVA] 구명보트 문제 풀이 (3) | 2023.11.19 |
[프로그래머스 JAVA] 짝지어 제거하기 문제 풀이 (0) | 2023.11.19 |