코드
import java.util.*;
//뮤직비디오(결정알고리즘)
class 뮤직비디오_ {
private static int count(int[] arr, int mid) {
int sum = 0, count =1; // 기본 배치를 한 개 하고 시작
System.out.println("======="+mid+"=======");
for(int num : arr) {
sum+=num;
if(mid<sum) {
sum = num;
count++;
}
}
System.out.println("앨범 수 "+count);
return count;
}
public static void main(String[] args){
int answer=0;
int[] arr = new Random().ints(10, 1,10)
.sorted()
.toArray();
System.out.println(Arrays.toString(arr));
int lt = arr[arr.length-1]; //가장 큰 노래 길이가 최소 한 1곡은 다 들어감
int rt = Arrays.stream(arr).sum();//모든 노래 길이 합이 가장 큰 경우의 수
int size = 5; // 앨범 개수
while(lt<=rt) {
int mid = (lt+rt)/2;
if(count(arr, mid) <= size) {
answer = mid;
rt = mid-1;
}else {
lt = mid+1;
}
}
System.out.println("앨범 당 합 곡길이 :"+answer);
}
}
결과
[3, 6, 6, 6, 6, 7, 7, 8, 9, 9]
=======38=======
앨범 수 2
=======23=======
앨범 수 4
=======15=======
앨범 수 6
=======19=======
앨범 수 4
=======17=======
앨범 수 5
=======16=======
앨범 수 6
앨범 당 합 곡길이 :17
반드시 이분 검색을 이용한 알고리즘은 정렬이 필수
'자료구조&알고리즘 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비' 카테고리의 다른 글
이진수 구하기(재귀) (0) | 2023.02.08 |
---|---|
재귀함수 (0) | 2023.02.05 |
마구간 정하기 (0) | 2022.12.17 |
장난꾸러기 (0) | 2022.12.09 |
LRU(Least Recently Used) (0) | 2022.12.06 |