728x90
반응형
https://www.acmicpc.net/problem/2343
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
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];
st=new StringTokenizer(br.readLine());
int end=0; // 전체 크기의 합 (전체 다 선택)
int start=0;//각각의 블루레이 중 가장 큰 값 여기선 9가 될 것 (딱 하나만 선택하는 경우)
//딱 하나만 선택하는 모든 경우의 수를 고려하려면 원소 중 가장 큰 값이 start로 와야함.
for(int i=0;i<n;i++) {
arr[i] = Integer.parseInt(st.nextToken());
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){
sum=0;
cnt++;
}
sum+=arr[i];
}
if(sum!=0){
cnt++;
//마지막에 잔류하는게 있으면 cnt에 하나더 더해줘야함
}
if(cnt>m){
start=mid+1;
}else{
end=mid-1;
}
}
System.out.println(start);
}
}
|
cs |
이진탐색의 기준을 무엇으로 해야할지 감이 안잡혔는데 항상 그렇듯 문제 속에 답이 있다. 블루레이의 크기 중 최소를 찾아내는 프로그램을 만들라고 한 것이 의도이고, 이진탐색을 통해 최소 크기의 블루레이를 찾아내면 된다.
생각해보면 end에 들어갈 블루레이는 가장 큰 크기가 될 것이니 원소의 모든 값을 더한 것이 될 것이다.
그렇다면 start에는 어떤 것이 들어가느냐가 관건이 된다.
가장 많이 나눠질 수 있는게 즉, m이 n일때인데, 이런 경우는 블루레이 하나에 각각 한개의 영상이 들어가는 경우이다. 한개의 영상이 들어가려면 원소 중 가장 큰 값이 기준이되어야 할 것이다. 그러니 start에는 원소들 중 가장 큰 값이 들어간다.
start와 end를 찾았으면 문제를 다 푼것이나 마찬가지이다.
그리고 문제 풀며 놓친게 하나 있는데
if(sum+arr[i]>mid)
조건문에서 sum+arr[i]를 판단해줘야했다. 그리고 나서 sum에다 arr[i]를 넣어줘야 했다. ! (뭐가 다른지 의아할 수 있는데 그래야 sum값에 손상이 가지 않는다..!)
728x90
반응형
'알고리즘 > 이진탐색' 카테고리의 다른 글
[java백준] 실버 2/ 6236번 용돈관리 (0) | 2022.07.29 |
---|---|
[C++ 백준] 실버 4/ 1920번 수찾기 (0) | 2022.02.08 |
[java 백준] 골드 5/ 2110번 공유기 설치 (0) | 2022.01.26 |
[java 백준] 실버 4/10816번 숫자카드 2 (0) | 2022.01.26 |
[java 백준] 실버 4/10815번 숫자카드 (0) | 2022.01.24 |
댓글