TIL

[코테연습] 1011. Capacity To Ship Packages Within D Days

크라00 2024. 6. 11. 23:42

금일은 이분탐색을 할 수 있는 문제를 풀었다.

 

https://leetcode.com/problems/capacity-to-ship-packages-within-d-days/description/

 

저번에 기록했던 문제와 동일하게 이분탐색 구조의 문제라는 것을 확인한 뒤 check() 함수만 잘 구현하면 풀 수 있는 문제이다.

 

먼저 low, high 를 초기화 한다.

 

int low = 0;

int high = weights[0] * 50_000; // 문제 조건 중 weights[i] 와 length 값이 5 * 10^4 것을 고려한 최대값

 

이분탐색을 위해 while 문을 작성한다.

 

       while(low <= high) {
            int mid = (low+high)/2;
            if (check(mid, weights, days)) {
                high = mid-1;
            } else {
                low = mid+1;
            }
        }
 
check() 함수가 true 일때는 mid 의 값이 허용된 것이므로 high 로 놓고, false 일때에는 mid 값이 허용되지 않았으므로 low 로 놓으면서 점점 범위를 좁혀나간다.
 
중요한 것은 check() 함수 이다.

 

weights 의 element 를 더해가면서 mid 보다 크면 day 를 증가시는 방식으로 구현한다.

완성된 코드는 다음과 같다

 

class Solution {
    public int shipWithinDays(int[] weights, int days) {

        int low = 0;
        int high = weights[0]*50_000;

        while(low <= high) {
            int mid = (low+high)/2;
            if (check(mid, weights, days)) {
                high = mid-1;
            } else {
                low = mid+1;
            }
            // System.out.println("["+low+", "+high+"] = "+mid);
        }
        return low;
    }
    boolean check(int mid, int[] weights, int days){
        // System.out.println("check mid : "+mid);
        int day = 1;
        int acc = 0;
        // System.out.println();
        for(int i = 0; i < weights.length;) {
            int w = weights[i];
            if ((w+acc) <= mid) {
                acc+=w;
                i++;
            } else {
                acc = 0;
                day++;
            }
            // System.out.println("day : ["+day+"] // acc : ["+acc+"] // w : ["+w+"]");
            if (day > days) {
        // System.out.println("rs day ===> "+day);
                return false;
            }
        }
        // System.out.println("day ===> "+day);
        if (day <= days) {
            return true;
        }
        return false;
    }


}