반응형
백준 2805번 나무 자르기
https://www.acmicpc.net/problem/2805
접근 방식
나무 m미터가 필요
절단기의 높이를 이분탐색의 요소
범위가 20억 => long범위로 잡아야할듯? 마지막에 실험해보자
구현 방법
- 이분탐색을 위한 나무 요소중 max값 찾기
- 나무 윗동을 center값으로 잡고 자르기
- 잘랐을 때의 길이를 count로 체크
- count가 m보다 크다면 height 최신화
- count는 길이를 더해줘야하는데 길이의 범위가 20억이기 때문에 20억 이상이되는 수가 나올 것임. count ⇒ long선언
⇒
나무를 아껴서 가장 최소의 m만 챙겨야하기 때문에!!! 절단기 설정 높이는 높아야 하는 것
가장 높은 것을 기준으로 이분탐색
4 7
20 15 10 17
이 테스트케이스에서는 20이 가장 높다
->
이분탐색의 범위를 1 ~ 20까지로 정함
중간부터 시작해서 쭉 돌려
만약에 범위안에 갯수가 맞다면 10
틀리면 왼쪽으로 가야겠지 => 이 높이에선 최소나무길이가 안맞기때문
맞으면 오른쪽으로 가야겠지 => 가장 조금 나무를 잘라야하니까
풀이
import java.io.*;
import java.util.*;
public class p2805 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[] a = new int[n];
st = new StringTokenizer(br.readLine());
int right = Integer.MIN_VALUE;
for(int i = 0; i < n; i++){
a[i] = Integer.parseInt(st.nextToken());
right = Integer.max(right, a[i]);
}
int left = 1;
long height = 0;
while(left <= right){
long count = 0;
int center = (left + right) / 2;
//나무 윗동을 center값 기준으로 자르기
for(int i = 0; i < n;i++){
if(a[i] >= center){
count += a[i] - center;
}
}
if(count >= m){
height = center;
left = center + 1;
}else{
right = center -1;
}
}
System.out.println(height);
}
}
후기
전형적인 이분탐색 문제 조금만 익숙해진다면 쉬운 이분탐색은 금방 풀 수 있을 것 같다.
반응형
'공부 > Algorithm' 카테고리의 다른 글
백준 16987 계란으로 계란치기 자바로 풀어 본 짧은 글 (0) | 2023.12.13 |
---|---|
백준 2866 문자열 잘라내기 자바로 풀어 본 짧은 글 (2) | 2023.12.08 |
백준 16401 과자 나눠주기 자바로 풀어 본 짧은 글 (0) | 2023.12.02 |
백준 29812번 아니 이게 왜 안돼 자바로 풀어 본 짧은 글 (0) | 2023.12.01 |
백준 11559번 Puyo Puyo 자바로 풀어 본 짧은 글 (0) | 2023.11.30 |