티스토리 뷰

728x90
반응형
문제 링크

http://boj.kr/2805

 

2805번: 나무 자르기

첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M을

www.acmicpc.net

문제 풀이

이 문제는 이분탐색에 분류되어 있는 문제이다.

 

이분탐색은 정렬되어있는 배열에서 원하는 값을 찾아가는 탐색법이다.

 

그런데 이 문제는  parametric search이라는 스킬을 이용해서 푼다.

 

간단하게 설명하자면 이분탐색은 시작과 끝의 중간점을 찾고 찾는 값이 더 크면 시작점을 중간점으로 잡고, 더 작으면 끝점을 중간점으로 잡고 다시 탐색하는것을 찾을 때 까지 반복한다.

 

그래서 원하는 값을 찾으면 종료시키는데, parametric search는 원하는값을 찾아도 계속해서 찾아나간다고 볼 수 있다.

 

자세한 코드는 다음과 같다.

소스 코드
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int N = sc.nextInt();
		int M = sc.nextInt();
		int [] treeLen = new int [N];
		int max = 0;
		int min = 1;
		int answer = 0;
		for (int i = 0; i < treeLen.length; i++) {
			treeLen[i] = sc.nextInt();
			max= Math.max(max, treeLen[i]);
		}
		long pivot = 0;
		while(max>=min) {
			long sum = 0;
            pivot = (0L+max +min) /2;
			for (int i = 0; i < treeLen.length; i++) {
				long len = treeLen[i] -pivot;
				if(len>0) sum += len;
			}
			if(sum >= M) {
				min = (int) (pivot +1);
				answer = Math.max(answer, (int)pivot);
			}else {
				max = (int) (pivot -1);
			}
		}
		System.out.println(answer);
	}

}
728x90
반응형

'Problem Solving' 카테고리의 다른 글

[ 백준 1520 ] 내리막 길 - Java  (0) 2021.01.04
[ 백준 2630 ] 색종이 만들기 - Java  (0) 2020.12.31
[ 백준 1629 ] 곱셈 - Java  (0) 2020.12.18
[ 백준 1149 ] RGB 거리 - Java  (1) 2020.12.16
[ 백준 1904 ] 01타일 ( Java )  (0) 2020.12.15
250x250
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함