728x90
문제
광재는 전자기기 대여사업을 시작했다. 퇴근하기 전에 다음날 손님들에게 빌려줄 N개의 전자기기를 충전하려 한다. 사용 가능한 콘센트는 M개가 있고, 성능은 모두 동일하다.
전자기기들은 한 번에 하나의 콘센트에서만 충전이 가능하고, 충전에 필요한 시간은 2k(0 ≤ k ≤ 15, k는 정수) 형태이다.
광재의 빠른 퇴근을 위해 모든 전자기기를 충전하기 위한 최소 시간이 얼마인지 알려주자.
입력
첫째 줄에 전자기기의 개수 N과 콘센트의 개수 M이 주어진다. (1 ≤ N ≤ 10,000, 1 ≤ M ≤ 10)
둘째 줄에 충전에 필요한 시간 ti를 나타내는 N개의 정수가 주어진다. (20 ≤ ti ≤ 215, ti = 2k (0 ≤ k ≤ 15, k는 정수))
출력
충전에 필요한 최소 시간을 출력한다.
해결 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
/*
*
* 빨리 끝낸다 -> 최대한 많이 동시에 실행한다. -> 가장 느린것부터 시작하면서 먼저 끝난것에 그다음 느린것을 시작한다.
*
* */
public class Main {
public static void main(String[] args) throws Exception{
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());
int[] chargeTime = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
Arrays.sort(chargeTime);
int currentTime = 0;
PriorityQueue<Integer> flug = new PriorityQueue<>();
//가장 충전시간이 긴 것부터 실행
for(int i=chargeTime.length-1;i>=0;i--){
//더이상 꽇을 플러그가 없다면 가장 먼저 끝나는 플러그를 뽑는다.
while(flug.size()==M){
currentTime = flug.poll();
}
//플러그에 꽂기
flug.add(currentTime + chargeTime[i]);
}
//나머지 충전시간 중 가장 긴 시간을 저장
while(!flug.isEmpty()){
currentTime = flug.poll();
}
System.out.println(currentTime);
}
}
실행 결과

팁
- 최대 값 문제는 DP, 그리디, 완전탐색 중에서 생각해보자.
- 가장 짧게 빈틈없이 구간을 만드려면 가장 긴 것 부터 넣어야 한다.
'알고리즘 문제 풀이 > 해결코드' 카테고리의 다른 글
[백준 - 10975][GOLD 5][해설 X] - 데크 소트 2 (JAVA) (0) | 2024.06.23 |
---|---|
[백준 - 6068][GOLD 5][해설 X] - 시간 관리하기 (JAVA) (0) | 2024.06.22 |
[백준 - 16678][GOLD 5][해설 X] - 모독 (JAVA) (0) | 2024.06.20 |
[백준 - 17396][GOLD 5][해설 X] - 백도어 (JAVA) (0) | 2024.06.19 |
[백준 - 14550[GOLD 5][해설 X] - 마리오 파티 (JAVA) (2) | 2024.06.11 |