728x90
나무 자르기
https://www.acmicpc.net/problem/2805
2805번: 나무 자르기
첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보
www.acmicpc.net
풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
int DesiredTreeLength = enterDesiredTreeLength();
ArrayList<Integer> trees = new ArrayList<>(enterTrees());
sorting(trees);
System.out.println(cutting(DesiredTreeLength, trees));
}
private static long cutting(int DesiredTreeLength, ArrayList<Integer> trees) {
long low = 0;
long high = trees.get(trees.size()-1);
while(low <= high){
long mid = (low + high) /2;
/**
* UPPER BOUND를 구하는 문제
* 만약 자른 크기가 원하는 길이보다 크다면? LOW를 높여
* 만약 자른 크기가 원하는 길이와 같다면? LOW를 높여
* 만약 자른 크기가 원하는 길이보다 작다면? HIGH를 줄여
*/
Long cuttingSize = trees.stream().filter(integer -> integer > mid).map(integer -> integer - mid).reduce((a, b) -> a + b).orElse(0L);
if(cuttingSize < DesiredTreeLength) {
high = mid-1;
}
else {
low = mid+1;
}
}
return high;
}
private static void sorting(ArrayList<Integer> trees) {
trees.sort(Comparator.naturalOrder());
}
private static List<Integer> enterTrees() throws IOException {
return Arrays.stream(br.readLine().split(" ")).map(Integer::parseInt).collect(Collectors.toList());
}
private static int enterDesiredTreeLength() throws IOException {
int[] inputs = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
return inputs[1];
}
}
728x90
'Algorithm > 백준' 카테고리의 다른 글
[백준/9184/Java] 신나는 함수 실행 (0) | 2022.02.18 |
---|---|
[백준/2110/Java] 공유기 설치 (0) | 2022.02.16 |
[백준/1654/Java] 랜선 자르기 (0) | 2022.02.14 |
[백준/10816/Java] 숫자 카드 2 (0) | 2022.02.13 |
[백준/1920/Java] 수 찾기 (0) | 2022.02.12 |