
문제

https://www.acmicpc.net/problem/2805
2805번: 나무 자르기
첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보
www.acmicpc.net
문제 풀이
처음 해당 문제를 풀 때 간단한 문제로 판단하여 완전 탐색을 시작하였다. 하지만 해당 문제의 나무의 개수는 최대 100만개, 길이는 2억이 넘는다. 그렇기에 완전 탐색으로 풀이하였을 때 시간초과가 나왔다.
해당 문제는 이진 탐색으로 풀면 시간초과를 해결할 수 있다.
나무를 자르는 기계로 자를 수 있는 높이는 최대는 가장 긴 나무의 길이, 최소는 0이다. 그렇기에 최대, 최소를 각각 가장 긴나무의 길이, 0으로 설정한다,
이 후 이 둘의 중간 값인 mid의 길이로 설정하여 나무를 자르면 얼마나 나오는지 확인한다.
이 때 잘린 나무의 길이가 필요한 나무의 길이보다 길 경우 해당 길이보다 높은 높이로 잘라야한다. 그렇기 때문에 최소 길이를 mid + 1로 대체한다.
반대로 잘린 나무의 길이가 필요한 나무의 길이보다 짧다면 해당 길이보다 낮은 높이로 잘라야 한다. 그렇기 때문에 최대 길이는 mid -1로 설정해준다.
해당 과정을 반복하면 최대와 최소가 같아지는 순간이 오고 해당 값이 결과 값이다.
아래는 예제 입력 1을 그림으로 구현한 모습이다.


해당 과정을 계속 진행하면 아래와 같은 결과가 나온다

이처럼 이진 탐색으로 진행하면 시간 복잡도가 N(M)에서 N(log2(M))으로 줄어든다. 이렇기에 원하는 값을 찾을 때 이진 탐색을 사용하여보자.
'algorithm > problems' 카테고리의 다른 글
| [백준] 18111번 마인크래프트 _ Node.js (0) | 2022.11.19 |
|---|---|
| [백준] 6568번 덩치 _ Node (1) | 2022.11.16 |
| [백준] 1261번 알고스팟_Node.js (0) | 2022.11.14 |
| [백준] 14225번 부분수열의 합 _ Node.js (0) | 2022.11.13 |
| [백준] 14226번 이모티콘 - Node.js (0) | 2022.11.13 |