https://school.programmers.co.kr/learn/courses/30/lessons/250137
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
오랜만의 코딩 테스트 포스팅입니다
옛날에 아는 형님이 추천해준 문제인데 귀차나가지고... 안풀다가 딱 생각이 나서 풀어봤읍니다...
재밌고 난이도도 적당하다고 했는데 ㄹㅇ 재밌는 문제긴 함
장문의 문제이긴 하지만 술술 읽힙니다
문제를 설명드리자면 게임에서 붕대를 감아서 몬스터에게 까인 피를 채울 수 있습니다
붕대는 초당 피가 차고 주어진 시전 시간을 다 채우면 추가 회복 효과도 있습니다 개혜자네요
반환은 캐릭터의 최종 체력이고 중간에 맞아 죽으면 -1을 반환합니다
매개변수는 세개가 있는데
1. bandage : 붕대 시전 시간, 초당 회복량, 풀 차징 시 추가 회복량 이 있는 1차원 배열
2. health : 캐릭터의 최대 체력
3. attacks : 몬스터의 공격 시간, 공격 피해량 이 있는 2차원 배열
몬스터의 마지막 공격 시간까지 반복을 해줬습니다
조건문으로 몬스터가 공격을 한다면 힐링 스택이 초기화되고 그 턴에는 힐링할 수 없습니다
반대로 공격이 없다면 초당 회복량만큼 그 턴에 회복을 하고 붕대 시전 시간만큼 회복을 이어서 했다면 추가 회복량을 추가로 회복시켜 줍니다
물론 최대 체력을 넘어선 안되겠죠
체력이 0 이하면 -1 반환
먼저 80점짜리 코드
// 프로그래머스 붕대 감기
// 피가 닳았을 때 붕대를 감아 피를 채울 수 있음
// 붕대를 감아서 얻은 수 있는 피 : t * 초 + y(풀차징 성공 시 추가 체력)
// 공격 당하면 기술이 끊김
// bandage[시전 시간, 1초당 회복량, 추가 회복량]
// health : 최대 체력
// attacks[공격 시간, 피해량]
class Solution {
public int solution(int[] bandage, int health, int[][] attacks) {
// 현재 체력
int curhealth = health;
// 몬스터 공격 카운터, 연속 힐링 스택
int cnt = 0, stack = 0;
// 마지막 몬스터 공격 시간까지 반복
for (int i = 0; i < attacks[attacks.length - 1][0] + 1; i++) {
// 몬스터의 공격
if (attacks[cnt][0] == i) {
curhealth -= attacks[cnt][1];
// 힐링 스택 까임
stack = 0;
cnt++;
}
// 안 맞았을 때 피 회복 시도
else {
// 힐링 스택
stack++;
// 초당 피 회복
curhealth += bandage[1];
// 힐링 풀차징 성공
if (stack == bandage[0]) {
curhealth += bandage[2];
}
// 오버 힐링 x
if (curhealth > health)
curhealth = health;
}
// System.out.println("time : " + i + " health : " + curhealth);
// 사망
if (curhealth <= 0)
return -1;
}
return curhealth;
}
}
위의 코드 ㄹㅇ 왜안되는지 모르고 대가리만 박았습니다
알고보니까 풀차징 성공 시에 힐링스택 초기화를 안넣었던겨;;;
정답 코드(힐링 스택 초기화 추가)
// 프로그래머스 붕대 감기
// 피가 닳았을 때 붕대를 감아 피를 채울 수 있음
// 붕대를 감아서 얻은 수 있는 피 : t * 초 + y(풀차징 성공 시 추가 체력)
// 공격 당하면 기술이 끊김
// bandage[시전 시간, 1초당 회복량, 추가 회복량]
// health : 최대 체력
// attacks[공격 시간, 피해량]
class Solution {
public int solution(int[] bandage, int health, int[][] attacks) {
// 현재 체력
int curhealth = health;
// 몬스터 공격 카운터, 연속 힐링 스택
int cnt = 0, stack = 0;
// 마지막 몬스터 공격 시간까지 반복
for (int i = 0; i < attacks[attacks.length - 1][0] + 1; i++) {
// 몬스터의 공격
if (attacks[cnt][0] == i) {
curhealth -= attacks[cnt][1];
// 힐링 스택 까임
stack = 0;
cnt++;
}
// 안 맞았을 때 피 회복 시도
else {
// 힐링 스택
stack++;
// 초당 피 회복
curhealth += bandage[1];
// 힐링 풀차징 성공
if (stack == bandage[0]) {
curhealth += bandage[2];
// 힐링 스택 초기화
stack = 0;
}
// 오버 힐링 x
if (curhealth > health)
curhealth = health;
}
// System.out.println("time : " + i + " health : " + curhealth);
// 사망
if (curhealth <= 0)
return -1;
}
return curhealth;
}
}
간만에 재밌는 문제였습니다!
다음에 더 재밌는 포스팅으로 돌아올게요!
'프로그래머스' 카테고리의 다른 글
[프로그래머스] [PCCE 기출문제] 9번 / 지폐 접기 (JAVA) (2) | 2024.12.23 |
---|---|
[프로그래머스] [PCCP 기출문제] 1번 / 동영상 재생기 (JAVA) (0) | 2024.12.22 |
[프로그래머스] 옹알이 (2) (JAVA) (2) | 2024.06.25 |
[프로그래머스] 명예의 전당 (1) (JAVA) (1) | 2024.03.30 |
[프로그래머스] 카드 뭉치 (JAVA) (2) | 2024.03.30 |