문제 출저
https://www.acmicpc.net/problem/23843
23843번: 콘센트
광재는 전자기기 대여사업을 시작했다. 퇴근하기 전에 다음날 손님들에게 빌려줄 N개의 전자기기를 충전하려 한다. 사용 가능한 콘센트는 M개가 있고, 성능은 모두 동일하다. 전자기기들은 한
www.acmicpc.net
문제 풀이
우선순위 큐 PriorityQueue (pq)를 이용하여 문제룰 풀었습니다.
충전 시간이 큰 전자기기부터 충전
반복문을 통해 전자기기를 돌면서 (time + 충전시간) 넣습니다.
pq에 허용양인 m을 초과하면 pq에서 값을 꺼내 time 에 넣습니다.
반복문이 끝난 후 남아있는 pq 같은 처리를 하여 정답을 구합니다.
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
/*
콘센트
https://www.acmicpc.net/problem/23843
2의 15승 = 32768
큰 것 부터 꼽는다.
작은 거 빼내면서 종료시간을 업데이트 한다.
*/
public class Main {
static int n; // 전자기기 개수
static int m; // 콘센트 개수
static Integer[] electronics; // 전자기기 충전에 필요한 시간
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
electronics = new Integer[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
electronics[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(electronics, Collections.reverseOrder());
int time = 0;
PriorityQueue<Integer> pq = new PriorityQueue<>();
for (int i = 0; i < n; i++) {
if (pq.size() >= m) {
time = pq.poll();
}
pq.add(time + electronics[i]);
}
while (!pq.isEmpty()) {
time = pq.poll();
}
System.out.println(time);
}
}