⬛ 프로그래머스 (PCCP 기출) | LV.1 붕대 감기 - 단순 구현 문풀 (Java)
https://school.programmers.co.kr/learn/courses/30/lessons/250137
💚문제 접근 방식
공격 attacks[][] 배열은 오름차순 정렬되어 있다고 나와있다. 그 중 max 시간대를 알아야 마지막 time처리가 가능해서 마지막 값의 attaks[N][0]의 값을 maxTime으로 두고 for문으로 (t=1~maxTime)까지 순회시켰다. 그리고 for문으로 1번의 순회에서 모든 처리가 가능하도록 고민하면서 구현했다. 성공해서 다행이다.
1) attVal[]를 maxTime 크기로 선언했다.
이곳에는 0~최대 시간까지의 공격 값을 담아줄 거다. 0이면 공격이 없는 거고, 0이 아니면 공격이 있는 것으로 구분해줬다.
//공격성을 전체 시간 배열에 담아둠
int[] attVal = new int[maxTime + 1];
for(int[] x : attacks){
attVal[x[0]] = x[1]; //공격성 없으면 0일 거임
}
- 왜 ? attacks가 2차원 배열인데 매번 t초마다 for문으로 순회하면서 일치하는 공격 시간을 찾는 게 무의 미하다고 생각이 들었다. 물론 이 문제는 데이터 크기가 매우 크지는 않아서 그렇게 풀어도 될 거 같긴 했다. 그런데 그냥 이렇게 풀고 1차원 for 문 순회하면서 처리를 한꺼번에 하고 싶었다.
2) for문으로 1~ maxTime 까지 순회하면서 처리하는 로직은 다음과 같다.
(1) 공격 attVal[t]가 0보다 크다면 (즉, 공격성 존재한다면) 공격성 처리
→ 단, 이 경우 연속 공격 = 0 처리 해주어야 하고, 현재 목숨값이 0 이하가 된다면 return -1 을 여기서 해준다.
→ 그리고 이 외의 케이스는 모두 처리 안해줘도 되므로 continue;
(2) linked++ 처리 후 현재 목숨값에 초당 회복값 처리해준다.
→ 단, 이 경우 목숨값이 health를 넘어간다면 다시 cur = health를 갖도록 정정해주고 continue 박아준다.
→ 처음에 제출했을 때 continue 처리를 안해주고 연속 공격 성공해서 Y 값 보너스 주는 부분을 타서인지 한 개의 케이스가 통과 안됐다. cur 이 health 값을 넘길 수 없으므로 여기서 continue 주는 게 맞다.
(3) 마지막으로 연속 공격이 bandage[0] 과 같아지면 보너스 회복 처리 후 연속 공격 리셋처리
3) 로직 모두 처리 후 현재의 회복값 반환 하면 정답 처리된다.
💚 제출 코드
import java.util.*;
class Solution {
public int solution(int[] bandage, int health, int[][] attacks) {
int N = attacks.length;
int maxTime = attacks[N-1][0];//이게 최대 시간임
int T = bandage[0]; //연속 시전
int X = bandage[1]; //시간당 ++
int Y = bandage[2]; //연속T 보너스 ++
int cur = health;
int linked = 0;//연속
//공격성을 전체 시간 배열에 담아둠
int[] attVal = new int[maxTime + 1];
for(int[] x : attacks){
attVal[x[0]] = x[1]; //공격성 없으면 0일 거임
}
for(int t = 1; t <=maxTime; t++){
linked++;
//공격성 처리
if(attVal[t] > 0) { //공격 바등면
linked = 0;//초기화
cur -= attVal[t];
if(cur <= 0) return -1;
continue;
}
cur += X;
if(cur > health) {
cur = health;//정정해줌
continue;
}
if(linked == T) {
linked = 0;
cur += Y;//보너스 처리받고
}
}
return cur;
}
}
'코딩 테스트 [준비] > [문풀] 프로그래머스_문풀_조지기' 카테고리의 다른 글
프로그래머스 | LV.2 멀쩡한 사각형- 구현 문풀 (Java) (26) | 2024.03.27 |
---|---|
프로그래머스 | LV.2 큰 수 만들기 - 그리디 문풀 (Java) (1) | 2024.03.27 |
프로그래머스 | LV.2 숫자 블록 - 단순 구현 문풀 (Java) (22) | 2024.03.19 |
프로그래머스 | LV. 2 시소 짝꿍 - 비례식 활용 문풀 (Java) (17) | 2024.03.19 |
프로그래머스 | LV.3 없어진 기록 찾기 (MySQL) (22) | 2024.03.13 |