JAVA/문제 풀이

[백준 / BOJ] 30205번 : 전역 임무 - JAVA

ahue 2023. 10. 9. 18:04
728x90

https://www.acmicpc.net/problem/30205

 

30205번: 전역 임무

김 병장이 소속된 특수부대는 전역을 하려면 특이하게 대대장으로부터 주어진 임무를 달성해야 한다. 김 병장이 받은 임무는 적군의 $1$번 기지부터 $N$번 기지까지 모두 순서대로 격파하는 것이

www.acmicpc.net

우선순위 큐 PriorityQueue

김 병장이 전역을 하기 위해서는 항상 전투력 P를 최대로 유지할 필요가 있다. 다행히 적군과 싸워도 P가 깎이지는 않으므로, 최대한 큰 값을 만들도록 +연산과 *연산을 조절해야 한다.

 

어떻게 해야 P가 최댓값을 계속 가질 수 있을까? 마이너스 연산이 없기 때문에, 할 수 있는 한 최대로 + 연산을 하고, 그 결괏값에 *2 연산을 해주면 최댓값을 얻을 수 있다.

 

1. 각 층에서 -1을 제외한 값을 정렬하고, 작은 순서대로 김 병장과 싸우게 한다. 김 병장의 P보다 공격력이 작거나 같다면 P에 적군의 공격력을 더해준다.
2. 만일 김 병장의 P보다 큰 적군이 나타난다면 -1이 남아 있는지 확인한다. 그리고 P가 적군보다 커지거나, 혹은 -1 개수가 0이 될 때까지 P를 두 배로 늘려준다.
3. 적군을 모두 해치운 후, 남은 -1의 개수만큼 P를 두 배씩 늘려준다.

 

전체 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

// 시간 : 476ms
// 메모리 : 51172KB
public class Main {

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		long P = Long.parseLong(st.nextToken());
		
		PriorityQueue<Integer> que = new PriorityQueue<>(new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				return o1 - o2;
			}
		});
		
		int twice = 0;
		for (int i = 0; i < N; i++) {
			twice = 0;
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < M; j++) {
				int n = Integer.parseInt(st.nextToken());
				if(n == -1) twice++;
				else que.offer(n);
			}
			
			while(!que.isEmpty()) {
				int cur = que.poll();
				if(cur <= P) {
					P += cur;
				} else {
					while(twice > 0 && P < cur) {
						twice--;
						P *= 2;
					}
					if(P < cur) {
						System.out.println(0);
						return;
					} else {
						P += cur;
					}
				}
			}
			
			while(twice > 0) {
				P *= 2;
				twice--;
			}
		}
		System.out.println(1);
		
	}

}
반응형