728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/142085
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
해설
dfs, dp등 여러 방법을 고려해봤지만 각 변수(n, k, enemy의 길이)가 너무 길어 시간초과가 걸렸습니다.
적들을 만나는데 순서가 있어 정렬을 사용하지 못하겠다고 생각했지만 조금 바꿔보면 가능했습니다.
처음부터 모든 적을 무적권없이 해결한다 가정하고 한계가 올 때마다 그동안 만난 적 중 가장 힘든 적(자동으로 계산하기 위해 우선순위큐를 사용)을 무적권으로 넘겨 다시 병사를 회복한다는 방식으로 해결가능했습니다.
코드
import java.util.*;
class Solution {
int answer;
public int solution(int n, int k, int[] enemy) {
answer = 0;
// 내림차순 정렬
PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
for(int i=0;i<enemy.length;i++){
// 무적권이 없으면서 병사도 부족한 경우
if(n<enemy[i] && k==0) break;
// 가장 많은 적이 나오는 순으로 나올 수 있도록 출력
pq.offer(enemy[i]);
// 병사가 부족한 경우 무적권을 사용해 가장 많은 적이 나왔던 라운드를 넘김(병사 회복)
if(n<enemy[i]){
n+=pq.poll();
k--;
}
// 현재 라운드의 적 만큼 병사 감소
n-= enemy[i];
//라운드 진행
answer++;
}
return answer;
}
}
728x90
'[IT] 코딩테스트 > [문제 및 풀이] 프로그래머스' 카테고리의 다른 글
[프로그래머스] 숫자 카드 나누기 / 자바(Java) (2) | 2023.10.28 |
---|---|
[프로그래머스] 혼자서 하는 틱택토 / 자바(Java) (1) | 2023.10.27 |
[프로그래머스] 과제 진행하기 / 자바(Java) (0) | 2023.10.25 |
[프로그래머스] 리코쳇 로봇 / 자바(Java) (1) | 2023.10.20 |
[프로그래머스] 두 원 사이의 정수 쌍 / 자바(Java) (2) | 2023.10.19 |