코드

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

코드

import java.util.*;
//마구간 정하기(결정알고리즘)
/*
5 3
1 2 8 4 9
*/
class 마구간정하기_ {

	private int count(int[] arr, int mid) {
		System.out.println("======"+mid+"======");
		int cnt = 1; // 맨 처음을 당연히 배치하니 1을 둔다.
		int position = arr[0];
		
		System.out.print(position+",");
		for(int i = 1 ; i < arr.length ; i++){
			if(arr[i]-position >= mid ) {
				System.out.print(arr[i]+",");
				cnt++;
				position = arr[i];
			}
		}
		System.out.println();
		
		return cnt;
	}

	public static void main(String[] args){
		
		마구간정하기_ T = new 마구간정하기_();
		int[] arr = new Random().ints(1, 30)
				                .distinct()
				                .limit(10)
				                .sorted()
				                .toArray();
		int c = 5;
		
		System.out.println(Arrays.toString(arr));
		int answer = 0;
		int lt = 1; // 주의할 것 arr[0]로 하면 답이 안 나올 수 있음
		int rt = arr[arr.length-1];
		
		while(lt<=rt) {
			int mid = (lt+rt)/2;
			if(T.count(arr, mid) >= c ) {
				//가능하니 거리를 넓여본다.
				answer = mid;
				lt = mid+1;
			}else {
				//불가능하니 거리를 좁혀본다.
				rt = mid-1;
			}
			
			
		}
		System.out.println(c+" 배치 가능한 적절한 거리 = "+answer);
		
	}
}

결과

[1, 5, 7, 11, 15, 18, 19, 23, 28, 29]
======15======
1,18,
======7======
1,11,18,28,
======3======
1,5,11,15,18,23,28,
======5======
1,7,15,23,28,
======6======
1,7,15,23,29,
5 배치 가능한 적절한 거리 = 6

결정알고리즘은 기본이 이진 검색이다. 따라서 정렬이 필수

'자료구조&알고리즘 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비' 카테고리의 다른 글

재귀함수  (0) 2023.02.05
뮤직비디오  (0) 2022.12.20
장난꾸러기  (0) 2022.12.09
LRU(Least Recently Used)  (0) 2022.12.06
버블정렬  (0) 2022.12.04

+ Recent posts