728x90
반응형
SMALL
이틀동안 틈틈히 고민하면서 푼 문제....
어떠한 게임에 붕대 감기라는 기술을 통해 health 를 회복하는 게임
시전시간, 초당 회복량, 추가 회복량의 변수값을 통해 몬스터에게 공격을 받은 만큼의 피을 계속 회복하는 게임이다
각각의 변수값이 주어지고 공격과 공격 타이밍을 변수로 받으면 그 값에 따라 마지막 공격에 남은 피를 확인해야하는데
우선 저는 HashMap을 통해 공격받는 시점을 모두 체크하였습니다.
그 후 시간대를 for 문으로 돌려서 아래 3가지 조건으로 문제를 해결했습니다!
1. 공격받는 시점에 hp 감소
2. 피가 가득 차있으면 다음 시간으로 패스
3. 공격입은 후 피를 회복할 때
처음에 문제를 해결하고 제출을 했을 때 테스트 14번에 막혔었다...
문제가 되는 부분을 확인해보니 회복 카운트를 할 때 조건을 아래 조건으로 잡아서 에러가 발생한 것...
hillCnt == bandage[0] || bandage[0] == 1
hillCnt 변수를 if 문 안에서 hillCnt++; 를 통해 계속 늘려줬었는데
그냥 조건을 if(++hillCnt == bandage[0]) 로 변경해서 문제를 해결했다!
정답
import java.util.*;
class Solution {
public int solution(int[] bandage, int health, int[][] attacks) {
int fullHealth = health;
// 공격 숫자
int chk = 0;
// 회복 카운트
int hillCnt = 0;
Map<Integer, Integer> att = new HashMap<>();
// 공격받는 시점 모두 체크
for(int i=0; i<attacks.length; i++){
att.put(attacks[i][0], attacks[i][1]);
}
for(int i=0; i<attacks[attacks.length-1][0]+1; i++){
// 공격받는 시점에 hp 감소
if(att.containsKey(i)){
health -= attacks[chk][1];
chk++;
hillCnt = 0;
// 피가 0 이하면 return -1
if(health <= 0) return -1;
continue;
}
// 풀피면 현재 시간 패스
if(fullHealth == health) continue;
// 공격을 입은 후 피를 회복할 때
if(fullHealth != health){
if(++hillCnt == bandage[0]){
health = health + bandage[1] + bandage[2];
hillCnt = 0;
}else{
health += bandage[1];
}
}
if(health > fullHealth) health = fullHealth;
}
return health;
}
}
출처
프로그래머스 - https://school.programmers.co.kr/learn/courses/30/lessons/250137
728x90
반응형
LIST
'코딩 테스트' 카테고리의 다른 글
코딩테스트 준비 (0) | 2024.02.11 |
---|---|
프로그래머스) [PCCE 기출문제] 10번 / 데이터 분석 Lv1 (2) | 2024.02.11 |
프로그래머스) 올바른 괄호 Lv2 (0) | 2024.02.08 |
프로그래머스) 이진 변환 반복하기 Lv2 (2) | 2024.02.08 |
프로그래머스) 예산 Lv1 (0) | 2024.02.07 |