문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/250137
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이거 풀어봤던 문제인데 간신히 풀었다..
알고리즘
우선순위 큐를 이용해서 풀었다. 우선순위 큐 정렬 조건을 attack 의 attack[0]을 기준으로 시간이 빠른 순으로 정렬한 뒤 담아두고 공격을 하는거다.
시간은 0초 부터 전위 연산자를 사용해서 항상 카운팅이 되게했고 우선순위 큐에서 가장 앞에 있는 값(시간이 빠른 공격 값)이 될때 까지 붕대감기 기술을 시전하는 시간 cnt를 후위 연산자로 카운팅을 했다. 그 cnt 값이 연속 성공한 시전시간 즉, bandage[0]이 같아지면 초당 회복되는것(bandage[1]) 값에 추가로 보너스 회복값(bandage[2])을 받는다. 그러나 항상 maxHealth이 있어서 계속 회복값이 커지는 것은 아닌점에서 Math.min값을 이용했다. 그리고 나서 가장 앞에있는 시간이 되면 health를 공격당한 것으로 바꿔주고 cnt도 0으로 reset을 시켜준다. 이때 while 문에서도 health 자체가 0이하가 되면 -1을 return하도록 밑에 써놨는데 생각해보니까 앞에 놔두는 게 더 좋지 않을까 싶다.
나는 왜이렇게 우선순위 큐밖에 생각이 안날까? 그냥 뽑으면 되서 쉽게 와닿는것 같다..
해결 방법
public int solution(int[] bandage, int health, int[][] attacks) {
int time = 0;
int maxHealth = health;
Arrays.sort(attacks, (o1, o2) -> o1[0] - o2[0]);
Queue<int[]> queue = new LinkedList<>();
for (int[] attack : attacks) {
queue.offer(attack);
}
int cnt = 0;
while (!queue.isEmpty()) {
while(++time < queue.peek()[0]) {
cnt++;
if (health < maxHealth && cnt < bandage[0]) {
health = Math.min(maxHealth, health + bandage[1]);
} else if (cnt == bandage[0]) {
health = Math.min(maxHealth, health + bandage[1] + bandage[2]);
cnt = 0;
}
}
int[] curAttack = queue.poll();
health -= curAttack[1];
cnt = 0;
if (health <= 0) {
return - 1;
}
}
return health;
}
'코테 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 PCCP] Lv1 9번 이웃한 칸 (0) | 2023.11.27 |
---|---|
[프로그래머스 PCCP] Lv1 10번 데이터 분석 (1) | 2023.11.27 |
[프로그래머스 Lv3] 여행경로 (0) | 2023.11.24 |
[프로그래머스 Lv2] 순위 검색 (0) | 2023.11.23 |
[프로그래머스 Lv2] 행렬 테두리 회전하기 (1) | 2023.11.22 |