CodeingTestPrac/Java Coding Test
[프로그래머스] 디펜스 게임 자바 : 막히면 자료구조를 생각해봐
sung.hyun.1204
2023. 9. 6. 19:07
문제 : 디펜스 게임
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
다음과 같이 n, k, 적들의 정보가 주어진 상황에서
-> 7, 3, [4, 2, 4, 5, 3, 3, 1]
적의 최대값이 10^6 으로 들어올 수 가 있다.
알고리즘의 시간복잡도가 O(N^2) 은 시간 초과가 날 것을 알기때문에
O(N*logN) 을 사용해야한다.
O(N*logN) 을 사용하여 해결 가능한 조건은
1. 자료구조 : 힙
2. 알고리즘 : 탐색 , DP , 백트래킹 등
으로 갈릴것 같다 . 탐색의 순서는 인덱스 0 번을 기준으로 시작 하여 데이터의 크기가 매우큼으로 , 특정조건을 만족하면 break,return 를 이용하는 방식으로 설계를 들어간다.
1. k +1 의 수 만큼 heap 우선순위 큐 자료구조에 순차적으로 적의 정보를 저장한다 .
2. heap 의 크기가 k 보다 크다면 heap 에서 pop 을 하여 나온 값을 현 n 값과 비교하고 , 값이 크다면 현 인덱스를 리턴, 아니면 n에서 차감후 진행한다.
k 번째 까지 저장후 k+1 을 꼭 넣어야 힙 자료구조를 정확하게 활용이 가능하다.
최소 힙의 크기가 곧 k 의 크기 인것이 문제의 포인트 인것 같다. (2 레벨인 이유)
import java.util.* ;
class Solution {
public int solution(int n, int k, int[] enemy) {
int answer = 0 ;
int total = enemy.length;
if(total <= k) return total ;
PriorityQueue<Integer> q = new PriorityQueue<>();
for(int i = 0 ; i < total ; i++) {
q.add(enemy[i]);
if(q.size() > k) {
int item = q.poll();
if(item > n ) {
return i ;
}
n -= item;
}
}
return total;
}
}