프로그래밍 공방

[백준] 1654번 : 랜선 자르기 본문

개발/문제해결

[백준] 1654번 : 랜선 자르기

hyosupsong 2021. 1. 12. 22:41

문제

www.acmicpc.net/problem/1654

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

www.acmicpc.net

문제해결방법

이 문제는 랜선의 길이를 기준으로 이분탐색으로 풀었다.

left를 자를 수 있는 가장 작은 길이, right를 K개의 랜선 중 최대 길이로 두고 mid(=(left+right)/2)의 길이로 잘라보면서

만약 N개보다 적다면 left를 mid+1로 해서 다시 탐색하고 N개보다 많거나 같으면 mid로 최대 길이를 갱신해준다.

코드

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
package baekjoon;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main1654_랜선자르기 {
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int K = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());
        long left = 1, right = Integer.MIN_VALUE;
        int[] line = new int[K];
        for(int i=0; i<K; i++) {
            line[i] = Integer.parseInt(br.readLine());
            if(right<line[i]) right = line[i];
        }
        long answer = 1;
        while(left<=right) {
            long mid = (left+right)>>1;
            long count = 0;
            for(int i=0; i<K; i++) {
                count += line[i]/mid;
            }
            if(count<N) right = mid-1;
            else {
                if(answer<mid) answer = mid;
                left = mid+1;
            }
        }
        System.out.println(answer);
    }
}
cs


코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.