코테/프로그래머스

[프로그래머스/Level2] 디펜스 게임 (JAVA)

imname1am 2024. 3. 11. 23:47
반응형

📖 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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

 

반응형