알고리즘/이분 탐색
백준 2805번: 나무 자르기 (JAVA)
눈사람99
2023. 4. 18. 19:47
728x90
문제 해석
M미터의 나무가 필요하다. 높이 H를 지정하면 톱날이 H만큼 상승하고
자른 이후 (자르는 나무의 높이) - H 만큼의 나무를 얻을 수 있다. 필요 이상으로 얻지 않기 위해 M을 얻을 수 있게 하는 H 중 가장 큰 값을 최종 결과로 여긴다.
알고리즘
H를 나무들 중 가장 큰 높이로 지정한 후 원하는 결과가 나올 때까지 H를 줄여가며 원하는 결과가 나오면 반복을 종료하여
M만큼 얻을 수 있는 H의 최대 높이를 구하고자 하였다.
허나 다음과 같이 구현시 시간초과가 발생하였다. 따라서 결과를 좀 더 빨리 찾을 수 있도록 이분 탐색을 활용하였다.
min은 0, max는 전과 같이 나무들 중 가장 큰 높이로 지정한다.
자르는 높이를 최소와 최대의 중간으로 하고 최소가 최대를 넘어서기 전까지 반복해서 자른다.
얻은 나무들의 총합이 필요한 나무의 개수보다 적으면 max를 줄여주고
보다 크거나 같으면 더 친환경적인 값을 찾을 수 있도록 min을 높여준다.
코드
728x90