Leetcode Java Minimum Number of Days to Make m Bouquets
업데이트:
문제
코드
class Solution {
public int minDays(int[] bloomDay, int m, int k) {
if ((long) m * k > bloomDay.length) {
return -1;
}
int left = 1;
int right = (int) 1e9;
while (left < right) {
int mid = left + (right - left) / 2;
if (this.isPossibleMakeBouquets(bloomDay, m, k, mid)) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
private boolean isPossibleMakeBouquets(int[] bloomDay, int m, int k, int day) {
int total = 0;
int length = bloomDay.length;
for (int i = 0; i < length; i++) {
int count = 0;
while (i < length && count < k && bloomDay[i] <= day) {
count++;
i++;
}
if (count == k) {
total++;
i--;
}
if (total >= m) {
return true;
}
}
return false;
}
}
결과
설명
- 각 꽃의 개화일이 담긴 bloomDay를 이용하여 한 번씩만 사용하여 k개의 인접한 꽃을 이용하여 m개의 꽃다발을 만들 때, 만들 수 있는 최소 일수를 구하는 문제이다.
- 단, 만들 수 없는 경우 -1을 주어진 문제의 결과로 반환한다.
-
$m \times k$가 bloomDay의 길이보다 커서 인접한 꽃을 한 번씩만 사용하여 꽃다발을 만들 수 없는 경우, -1을 주어진 문제의 결과로 반환한다.
-
일자 탐색에 필요한 변수인 left와 right에 left는 최소 개화일인 1, right는 최대 개화일인 $10^9$로 초기화한다.
- left가 right 미만일 때 까지 아래를 반복한다.
- mid에 $left + \frac{right - left} / 2$인 중앙값을 넣어준다.
- 5번에서 정의한 isPossibleMakeBouquets(int[] bloomDay, int m, int k, int day)인 꽃다발을 만들 수 있는 경우, right에 mid를 아니면 left에 $mid + 1$을 넣어 개화일 탐색 범위을 좁혀준다.
- bloomDay 내 k개의 인접한 꽃을 이용하여 m개의 꽃다발을 만들 수 있는지 검증하기 위한 isPossibleMakeBouquets(int[] bloomDay, int m, int k, int day) 메서드를 정의한다.
- 문제 풀이에 필요한 변수를 정의한다.
- total은 총 꽃다발의 갯수를 계산할 변수로, 0으로 초기화한다.
- length는 bloomDay의 길이를 저장한 변수이다.
- 0부터 length 미만까지 i를 증가시키며 아래를 반복한다.
- count는 꽃의 갯수를 계산할 변수로, 0으로 초기화한다.
- i가 length 미만이면서 count가 k개 미만이고, bloomDay[i] 값이 day 이하인 꽃다발에 꽃을 넣을 수 있을 때 까지 count와 i를 증가시킨다.
- count가 k인 꽃다발이 완성된 경우, total인 꽃다발의 갯수를 증가시키고 i를 감소시킨다.
- total이 m 이상이면 m개의 꽃다발이 완성되었으므로, true를 반환한다.
- 반복이 완료되면 꽃다발을 완성할 수 없으므로, false를 반환한다.
- 문제 풀이에 필요한 변수를 정의한다.
- 반복이 완료되면 최소 일수가 저장된 left를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기