알고리즘문제풀이/백준
[BOJ]2805_나무자르기
초보개발자..
2021. 6. 21. 14:54
--문제--
https://www.acmicpc.net/problem/2805
2805번: 나무 자르기
첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보
www.acmicpc.net
--문제접근--
나무자르기는 대표적으로 이분탐색의 문제로 이분탐색을 구현하여서 문제풀이를 진행하였습니다. 하지만 또 INT형으로 문제를 계속 풀다보니 답이 틀렸다고나와서 LONG형으로 바꿔 문제풀이를 진행하여보니 문제가 풀렸습니다.
package 백준문제풀이;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
public class BOJ_2805_나무자르기 {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb=new StringBuilder();
StringTokenizer st=new StringTokenizer(br.readLine());
int N=Integer.parseInt(st.nextToken());
int M=Integer.parseInt(st.nextToken());
int[] arr=new int[N];
st=new StringTokenizer(br.readLine());
for(int i=0;i<N;i++) {
arr[i]=Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
long ans=0;
long start=0;
long end=arr[N-1];
long mid=0;
while(start<=end) {
mid=(start+end)/2;
long cnt=0;
for(int i=0;i<N;i++) {
long temp=arr[i]-mid;
if(temp>0)cnt+=temp;
}
if(cnt>=M) {
ans=mid;
start=mid+1;
}
else end=mid-1;
}
sb.append(ans);
bw.write(sb.toString());
bw.flush();
bw.close();
}
}