BOJ_6236 용돈 관리

sophie·2022년 1월 14일
0

알고리즘스터디

목록 보기
13/14

right값 지출금액의 총합으로 설정해 주었다. 지출금액 > 인출금액 일 경우가 있기 때문이다.

package BinarySearch;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ_6236 {
    static int[] price;
    static int n, m, k,left,right;
    static BufferedReader br;
    static StringTokenizer st;

    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        price = new int[n];

        for (int i = 0; i < n; i++) {
            price[i] = Integer.parseInt(br.readLine());
            right += price[i];

        }

        left = 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            int temp = check(mid, n, m);
            if (temp == -1 || temp == 0) left = mid + 1;
            if (temp == 1 || temp == 2) right = mid - 1;
        }
        System.out.println(left);

    }

    // 횟수 체크

    /**
     * @param mid 인출금액
     * @param n
     * @param m   인출 횟수
     * @return 0 : 인출횟수 초과
     * 1 : 인출횟수 일치
     * 2 : 인출횟수 미만
     * -1 : 인출금액 < 지출금액
     */
    private static int check(int mid, int n, int m) {
        int current = 0;
        int cnt = 0;
        for (int i = 0; i < n; i++) {
            if (mid < price[i]) return -1;
            if (current < price[i]) {
                cnt++;
                current = mid;
                if (cnt > m) return 0;
            }
            current -= price[i];
        }
        return cnt == m ? 1 : 2;
    }
}

0개의 댓글