HS_development_log

백준 2343번 - 기타 레슨 / Java 본문

Algorithm-백준/이분탐색

백준 2343번 - 기타 레슨 / Java

DevHyeonseong 2020. 2. 7. 14:12
반응형

문제

https://www.acmicpc.net/problem/2343

 

2343번: 기타 레슨

강토는 자신의 기타 레슨 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 레슨이 들어가는데, 블루레이를 녹화할 때, 레슨의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경우에는 레슨의 흐름이 끊겨, 학생들이 대혼란에 빠질 수 있기 때문이다. 즉, i번 레슨과 j번 레슨을 같은 블루레이에 녹화하려면 i와 j 사이의 모든 레슨도 같은 블루레이에 녹화해야 한다. 강토는 이 블루레이가 얼마나 팔릴지 아직 알 수 없기 때문에, 블루레이의 개수를 가

www.acmicpc.net

이분 탐색으로 무엇을 찾아야 하는지 감을 못 잡아서 어려웠던 문제.

블루레이의 크기를 이분 탐색으로 찾고, 그때의 개수를 세서 m과 비교해주면 된다.

항상 느끼지만 이분 탐색은 이분 탐색의 대상을 잘 찾기만 해도 반은 풀고 들어가는 유형인 것 같다

 

알고리즘

  1. 블루레이의 크기를 이분 탐색한다. 시작 범위는 레슨 크기의 최댓값, 끝범위는 모든 레슨크기의 합이다.

  2. 블루레이의 크기를 mid라고 했을 때, mid가 너무 커서 개수가 부족하면 범위를 낮추고, 개수가 많으면 범위를 높인다

  3. 블루레이의 개수가 m이 되면 그때의 크기를 출력한다

소스코드

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
/*
 * BOJ2343
 * 2020.02.07
 * Hyeonseong 
 */
import java.util.*;    
public class BOJ2343 {
    public static void main(String[] args) {
        Solution s = new Solution();
    }
}
class Solution{
    int n; // 레슨의 수
    int m; // 블루레이의 수 
    int les[]; // 강의
    int answer; // 정답 
    public Solution() {
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        m = scan.nextInt();
        les = new int[n];
        int start = 0, end = 0;
        answer = 0;
        for(int i=0;i<n;i++) {
            les[i] = scan.nextInt();
        }
        for(int i=0;i<n;i++) {
            if(start < les[i]) {
                start = les[i];
            }
            end+=les[i];
        }
        while(start<=end) {
            int mid = (start+end)/2// 블루레이의 크기
            if(go(mid)) { 
                answer = mid;
                end = mid-1;
            } else {
                start = mid+1;
            }
        }
        System.out.println(answer);
    }
    public boolean go(int size) {
        int cnt = 0;
        int sum = 0;
        for(int i=0;i<n;i++) {
            if(sum+les[i]>size) { // 레슨크기의합이 사이즈보다 커지면
                cnt++// 블루레이의 개수를 1개늘리고
                sum = les[i]; // 새로운 그룹을 만든다
            } else {
                sum+=les[i];
            }
        }
        return (cnt>=m) ? false : true;
    }
}
cs
반응형

'Algorithm-백준 > 이분탐색' 카테고리의 다른 글

백준 2805번 - 나무 자르기 / Java  (0) 2020.02.04
백준 1654번 - 랜선 자르기 / Java  (0) 2020.02.04