본문 바로가기
알고리즘/이진탐색

[java백준] 실버 2/ 6236번 용돈관리

by Meaning_ 2022. 7. 29.
728x90
반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
 
class Main {
    public static int n;
    public static int m;
 
    public static int arr[];
 
 
 
    public static void main(String args[]) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st=new StringTokenizer(br.readLine());
        n=Integer.parseInt(st.nextToken());
        m=Integer.parseInt(st.nextToken());
        arr=new int[n];
        int start=0;
        int end=0;
 
        for(int i=0;i<n;i++){
            arr[i]=Integer.parseInt(br.readLine());
            end+=arr[i];
            if(start<arr[i]){
                start=arr[i];
            }
        }
 
 
 
        while(start<=end){
            int mid=(start+end)/2;
 
            int sum=0;
            int cnt=0;
 
            for(int i=0;i<n;i++){
 
 
                if(sum+arr[i]>mid){
                    cnt++;
                    sum=0;
                }
                sum+=arr[i]; //집어넣고 다시 k원 인출 가능
 
            }
            if(sum!=0){
                cnt++;
            }
 
 
            if(cnt>m){
                start=mid+1;
            }else{
                end=mid-1;
            }
 
        }
        System.out.println(start);
 
 
 
 
 
 
 
    }
 
}
cs

 

start와 end의 기준을 잘 세워줘야 했다.

나는 start를 1 end를 100000으로 해줬는데 생각해보니 end의 경우 하나 당 들어올 수 있는 최대가 10000였다. 그래서 end는 원소의 총합으로 해줘도 좋고, 아예 1000*100000(n값의 최대)로 설정해줘도 된다.

 

그러면 문제는 start이다. start를 찾아내기 위해서는 이진탐색의 mid가 무엇을 의미하는지 다시 생각해볼 필요가 있다. mid는 결국에 현우가 인출할 금액이고, 이 금액은 하루 동안 쓸 금액보다 많으면 많았지 적어서는 안된다. 

이런 상황을 예방하기 위해서 start를 잘 설정해줘야 한다. 결국에 하루동안 쓸 금액의 기준은 n개의 수들 중 가장 큰 수를 기준으로 두면 인출할 금액이 하루동안 쓸 금액보다 많거나 같게 된다.

 

start는 n개의 수 중 가장 큰 수 end는 n개의 수를 다 더한것 이라 생각하면 될 것 같다. 

 

728x90
반응형

댓글