https://school.programmers.co.kr/learn/courses/30/lessons/250137
[PCCP 기출문제] 1번 / 붕대 감기
문제는 url 누르면 들어가서 보실 수 있습니다.
충분히 문제를 읽어보고 풀이를 보시면 좋을 것 같습니다.
풀이
저의 풀이라서 완벽한 정답인지는 모르겠습니다.
반복문을 실행할 때 시작 index를 공격하는 시간부터 시작했습니다.
불필요한 붕대감기가 필요하지 않다고 생각했습니다. (풀피인데 포션 먹는 낭비)
public int solution(int[] bandage, int health, int[][] attacks) {
int answer = 0;
int attackFirstTime = attacks[0][0];
int attackLastTime = attacks[attacks.length - 1][0];
int attackIdx = 1;
int bandDurationTime = 0;
int initHealth = health - attacks[0][1];
// 죽었을 때
if (initHealth <= 0)
return -1;
for (int i = attackFirstTime + 1; i <= attackLastTime; i++) {
if (attacks[attackIdx][0] == i) { // 공격받을 때
initHealth -= attacks[attackIdx++][1];
// 죽었을 때
if (initHealth <= 0)
return -1;
bandDurationTime = 0;
} else { // 치료할 때
bandDurationTime++;
if (bandDurationTime == bandage[0]) {
initHealth += bandage[1] + bandage[2];
if (initHealth >= health)
initHealth = health;
bandDurationTime = 0;
} else if (initHealth > health)
initHealth = health;
else {
initHealth += bandage[1];
if (initHealth > health)
initHealth = health;
}
}
}
answer = initHealth;
return answer;
}
}
1. 첫 번째 공격 시간과 마지막 공격 시간
int attackFirstTime = attacks[0][0];
int attackLastTime = attacks[attacks.length - 1][0];
2. 몇 번째 공격인지 확인하는 index
int attackIdx = 1;
3. 붕대감기 연속 시간 및 처음 체력(첫 공격에 먼저 체력 깎기)
int bandDurationTime = 0;
int initHealth = health - attacks[0][1];
4. 처음 공격에 체력이 0 이하가 될 수 있습니다.
// 죽었을 때
if (initHealth <= 0)
return -1;
5. 처음 공격시간 ~ 마지막 공격까지의 붕대감기와 공격 맞기 반복문
for (int i = attackFirstTime + 1; i <= attackLastTime; i++) {
if (attacks[attackIdx][0] == i) { // 공격받을 때
initHealth -= attacks[attackIdx++][1];
// 죽었을 때
if (initHealth <= 0)
return -1;
bandDurationTime = 0;
} else { // 치료할 때
bandDurationTime++;
if (bandDurationTime == bandage[0]) {
initHealth += bandage[1] + bandage[2];
if (initHealth >= health)
initHealth = health;
bandDurationTime = 0;
} else if (initHealth > health)
initHealth = health;
else {
initHealth += bandage[1];
if (initHealth > health)
initHealth = health;
}
}
}
(1) 처음 공격시간 + 1부터 시작
(2) 공격을 받았은 시간인지 아닌지 판단
→ 공격을 받았다면 괴물의 공격력만큼 처음 체력 - 괴물의 공격력
→ 공격받고 체력이 0 이하가 되면 -1 return
(3) 붕대감기의 시간일 때
붕대감기 지속시간 + 1
3-1. 붕대감기 지속시간이 붕대감기 시전시간이 같다면 초당회복 + 추가 회복하기
3-2. 최대체력과 현재 체력이 같으면 회복하지 않기
3-3. 붕대감기 지속시간이 붕대감기 시전시간과 같지 않다면 초당 회복만 하기
이런 식으로 코드를 작성했는데, 답안지 보니까 더 간단한 풀이가 있더라고요.
여러분도 여러분만의 코드를 작성하고 고수들의 코드를 분석해 보아요.
소감
이번 문제는 뭔가 더 재밌었습니다. 왜냐하면 제가 게임할 때 이런 생각을 했거든요. 나도 코드로 이런 함수는 짤 수 있을 텐데 라는 생각을 말이죠.
처음으로 게임 속의 함수를 만들어 본 것 같아서 굉장히 뜻깊었고 오래간만에 코딩 테스트 문제를 풀어서 신났습니다.
'코딩 개발 > Java' 카테고리의 다른 글
[Java] compareTo 함수(문자, 숫자 사전적 비교) (0) | 2024.03.11 |
---|---|
[Java] equals 메서드 (변수 위치, ==과의 차이) (0) | 2024.02.10 |
Eclipse - .properties 파일 한글 깨짐 해결 방법 (0) | 2023.12.16 |
Java - 디렉토리 자동생성, 파일 자동 생성, 파일 내용 자동 변경 (1) | 2023.10.19 |
String.format (%d(10진수), %s(문자열), %f(실수형 숫자)) (0) | 2023.10.18 |