PS (Problem Solving)/Baekjoon
[백준] 2805. 나무 자르기
캐럿노트
2022. 7. 10. 22:06
문제
https://www.acmicpc.net/problem/2805
2805번: 나무 자르기
첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보
www.acmicpc.net
설계
- 처음에는 내음대로 풀었으나 시간초과
- 투포인터 학습 후 접근
- start와 end 설정이 중요하다.
N, M = map(int, input().split())
arr = list(map(int, input().split()))
arr.sort()
start = 1
end = max(arr)
while start <= end:
mid = (start + end) // 2
sumV = 0
for i in arr:
if i > mid: # 높이보다 큰 나무 벌목
sumV += i - mid
if sumV >= M: # 자른 나무 양 확인
start = mid + 1
else:
end = mid - 1
print(end)
아래는 처음 구현한 시간초과 코드
(테스트케이스는 맞았으나 나머지는 모른다)
N, M = map(int, input().split())
arr = list(map(int, input().split()))
arr.sort(reverse=True)
flag = 0
index = 0
line = 0
for i in range(1, N):
sumV = 0
if flag == 1:
break
for j in range(i-1):
sumV += abs(arr[j]-arr[i])
if sumV >= M:
flag = 1
index = i
line = arr[i]
break
switch = 1
while switch:
sumV = 0
for i in range(index):
sumV += abs(arr[i] - line)
if sumV >= M:
result = line
line += 1
else:
print(result)
switch = 0