[프로그래머스/Level2] 디펜스 게임 (JAVA)
📖 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡 풀이 방식
• 우선순위 큐
- 적의 수를 순서대로 우선순위 큐에 저장한다. (무적권으로 방어할 라운드의 적의 수)
- 무적권의 수보다 방어할 라운드가 많은 경우, 적의 수가 가장 적은 라운드에서 전투해 병력을 감소한다.
- 병력이 0보다 적어지면, 게임이 종료되며 해당 라운드 수를 반환한다. / 게임을 클리어한 경우, 총 라운드 수를 반환한다.
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import java.util.*;
class Solution {
public int solution(int n, int k, int[] enemy) {
int answer = enemy.length; // 모든 라운드 클리어 가능할 경우 리턴 값
PriorityQueue<Integer> pq = new PriorityQueue<>(); // 무적권 사용해 해치울 적의 수
for(int i = 0 ; i < enemy.length ; i++) {
pq.offer(enemy[i]); // 각 라운드의 적의 수 저장
if(pq.size() > k) // 무적권 수보다 방어할 라운드가 많은 경우, 적의 수가 가장 적은 라운드 전투
n -= pq.poll();
if(n < 0) // 남은 병사가 없는 경우, 게임 종료
return i;
}
return answer; // 게임 클리어한 경우, 총 라운드 수 반환
}
}
|
cs |
➕ 다른 풀이 방식
- 이분 탐색을 활용한 풀이
프로그래머스 - 디펜스 게임(Java)
[수정 알림] 파라메트릭 서치 및 우선순위 큐로 문제를 해결했는데, 테케 10번에서 시간초과가 발생하신다는 분이 계셨습니다. 저의 경우 제 방법이 아슬아슬하게 통과를 했던것 같고, 서버 상태
ksb-dev.tistory.com
- 묘..하게 다른 풀이
[연습 문제] 디펜스 게임 - JAVA
https://school.programmers.co.kr/learn/courses/30/lessons/142085 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞
yummy0102.tistory.com
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import java.util.*;
class Solution {
public int solution(int n, int k, int[] enemy) {
int answer = enemy.length;
PriorityQueue<Integer> pq = new PriorityQueue<>(); // 거쳐온 최댓값 저장하기 위한 우선순위 큐
for (int i = 0; i < enemy.length; i++) {
n -= enemy[i]; // 우선순위 큐에 적의 수를 저장
pq.add(enemy[i]);
if(n < 0) { // 남은 병사 수가 0보다 적으면, 무적권 사용
if(k > 0) {
n += pq.poll(); // 가장 큰 값에 대해 무적권 사용
k--;
continue;
}
answer = i;
break;
}
}
return answer;
}
}
|
cs |
- 우선순위 큐를 내림차순 정렬해서 푸신 풀이
[프로그래머스] 디펜스 게임 JAVA
문제링크enemy의 길이가 짧지만은 않아서 모든 경우의 수를 따지기에는 부담이 따를 것이라고 예상했다.사고의 흐름은 지금까지의 뺀 값들 중에 가장 큰 것을 롤백한다는 상상이 먼저 떠올랐다.
velog.io
(Java) 프로그래머스 - 디펜스 게임
입력값이 매우 큰 편이었기 때문에 O(n) 이내에 끝내야겠다는 생각을 했다. 처음에는 내림차순으로 정렬을 하고 k를 우선적으로 사용하고, 나머지는 n을 사용하는 로직을 생각했다가 잘못된 로직
rovictory.tistory.com
💦 어려웠던 점
- 데이터 크기가 너무 크길래 그리디, 정렬할 생각은 했는데, 우선순위 큐 (최대 힙) 사용할 생각은 못 했다.
- 무적권을 크기가 작은 데이터에 사용할 생각을 했었다. (하지만 무적권은 상대 enemy가 많은 라운드에 사용하는 것이었다,,)
🧐 새로 알게 된 내용
우선순위 큐(시간 복잡도 : O(logN))를 언제 사용하는지
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
[Java] 프로그래머스 [Level-2] 디펜스 게임
import java.util.PriorityQueue; public class Solution { // 디펜스 게임 public static int solution(int n, int k, int[] enemy) { int answer = enemy.length; // 모든 라운드 클리어 가능할 경우의 리턴 값 PriorityQueue pq = new PriorityQueue
dev-skill.tistory.com
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr