☕️ 자주 쓰는 Arrays.stream 정리
- Arrays.stream(arr).sum() → 배열의 총합
- Arrays.stream(arr).max().getAsInt() → 배열의 최대값
- Arrays.stream(arr).min().getAsInt() → 배열의 최소값
- Arrays.stream(arr).average().getAsDouble() → 평균값 (double 리턴)
- Arrays.stream(arr).distinct().toArray() → 중복 제거한 배열 반환
📌 문제 설명
가수 조영필의 라이브 공연을 DVD로 제작하려고 합니다. 총 N개의 곡이 있으며, M개의 DVD에 곡들을 나눠 담아야 합니다. 이때 다음 조건을 지켜야 합니다:
- 곡의 순서는 바뀌면 안 됨
- 곡을 나눠서 담으면 안 됨
- 모든 DVD는 같은 크기여야 함
목표: DVD 용량(길이)을 최소로 하면서 M개의 DVD로 모든 곡을 담는 것
📝 입력 & 출력
입력
- 첫 줄: 곡의 개수 N (1 ≤ N ≤ 1,000), DVD 수 M (1 ≤ M ≤ N)
- 둘째 줄: 각 곡의 길이(자연수, 10,000 이하)
출력
- 최소 DVD 크기를 출력
🔸 예제 입력 & 출력
예제 입력
9 3
1 2 3 4 5 6 7 8 9
예제 출력
17
설명: DVD 크기가 17일 경우, 아래처럼 담을 수 있습니다.
- (1 2 3 4 5)
- (6 7)
- (8 9)
💡 해결 방법
- 결정 알고리즘(Binary Search) 사용
- 가능한 DVD 용량의 최소값을 이분 탐색으로 찾아감
핵심 아이디어
- 가능한 최소 DVD 크기: 가장 긴 곡
- 가능한 최대 DVD 크기: 모든 곡의 합
- 해당 DVD 용량(mid)으로 모든 곡을 나눌 수 있는지 체크 (count 함수)
💻 코드 구현 (Java)
package partSort;
import java.util.*;
public class Problem9 {
public int count(int[] arr, int capacity) {
int cnt = 1, sum = 0;
for (int x : arr) {
if (sum + x > capacity) {
cnt++;
sum = x;
} else sum += x;
}
return cnt;
}
public int solution(int n, int m, int[] arr) {
int answer = 0;
int lt = Arrays.stream(arr).max().getAsInt();
int rt = Arrays.stream(arr).sum();
while (lt <= rt) {
int mid = (lt + rt) / 2;
if (count(arr, mid) <= m) {
answer = mid;
rt = mid - 1;
} else {
lt = mid + 1;
}
}
return answer;
}
public static void main(String[] args) {
Problem9 T = new Problem9();
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
int m = kb.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) arr[i] = kb.nextInt();
System.out.print(T.solution(n, m, arr));
kb.close();
}
}
📖 코드 설명
1️⃣ count 함수
public int count(int[] arr, int capacity) {
int cnt = 1, sum = 0;
for (int x : arr) {
if (sum + x > capacity) {
cnt++;
sum = x;
} else sum += x;
}
return cnt;
}
- 주어진 DVD 용량(capacity)으로 몇 개의 DVD가 필요한지 계산
2️⃣ 이분 탐색 (Binary Search)
int lt = Arrays.stream(arr).max().getAsInt(); //최대 곡 길이
int rt = Arrays.stream(arr).sum(); //모든 곡의 합
while (lt <= rt) {
int mid = (lt + rt) / 2;
if (count(arr, mid) <= m) {
answer = mid;
rt = mid - 1;
} else {
lt = mid + 1;
}
}
- DVD 용량을 이분 탐색하면서 최소 가능한 크기를 찾아감
⏳ 시간 복잡도 분석
- 이분 탐색: O(log(rt - lt))
- count 함수 (매번 탐색 시): O(N)
- 전체 복잡도: O(N * log(rt - lt))
출처: 인프런 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
https://www.inflearn.com/course/자바-알고리즘-문제풀이-코테대비/dashboard
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의 | 김태원 - 인프런
김태원 | , 자바(Java) 알고리즘 문제풀이 채점사이트를 통해 기초부터 준비해보세요! 💪 [사진] 이 강의는 [사진] 자바(Java)로 코딩테스트 준비를 하고 계신 분께 추천드려요! 문제는 기초~ 중급
www.inflearn.com
'코딩테스트 > 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비' 카테고리의 다른 글
| 섹션 7 Recursive, Tree, Graph - 2. 재귀함수를 이용한 이진수 출력 (1) | 2025.04.26 |
|---|---|
| 섹션6. Sort - 10. 마구간 정하기(결정알고리즘) (0) | 2025.04.26 |
| 섹션6. Sort - 8. 이분검색 (2) | 2025.04.24 |
| 섹션6. Sort - 7. 좌표 정렬 (0) | 2025.04.24 |
| 섹션6. Sort - 6. 장난꾸러기 (0) | 2025.04.13 |