-
[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(); } }
'알고리즘문제풀이 > 백준' 카테고리의 다른 글
[BOJ]2467_용액_Java (0) 2021.07.10 [BOJ]2252_줄세우기_Java (0) 2021.07.10 [BOJ]1654_랜선자르기 (0) 2021.06.21 [BOJ]2110_공유기설치_Java (0) 2021.06.17 [BOJ]10816_숫자카드2_Java (0) 2021.06.16