본문 바로가기
파이썬알고리즘

백준 2805 파이썬

by zho 2023. 12. 21.

https://www.acmicpc.net/problem/2805

 

2805번: 나무 자르기

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

www.acmicpc.net

처음 구현한 방법 : 시간 초과가 날걸 알면서도 다른 방법이 생각나지 않아 일단 코드를 작성하고 제출했다. 예제 코드는 돌아가지만 제출을 하니 역시 시간초과가 발생했다.

n, m = map(int, input().split())
h = list(map(int,input().split()))
maxchecker = max(h) - 1
minchekcer = min(h) + 1
len = maxchecker - minchekcer
total = 0


for i in range(len):
    for j in range(n):
        if(h[j] - maxchecker >= 0):
            total += h[j] - maxchecker
    if(total >= m):
        print(maxchecker)
        break
    maxchecker -= 1
    total = 0

 

시간초과가 뜨면 어떤 구현 방법을 써서 구현해야 할지 다시 생각해봐야 한다. 이렇게 크기를 비교하며 반복하는 구조에서는 주로 이분탐색을 이용하면 시간초과 문제를 해결할 수 있다.

이분탐색(이진탐색? https://namu.wiki/w/%EC%9D%B4%EC%A7%84%20%ED%83%90%EC%83%89

n, m = map(int, input().split())
trees = list(map(int,input().split()))
startPoint = 1
endPoint = max(trees)
total = 0

while startPoint <= endPoint:
    mid = (startPoint + endPoint) // 2
    total = 0
    for i in trees:
        if i >= mid:
            total += i - mid
    
    if total >= m:
        startPoint = mid + 1
    else:
        endPoint = mid - 1
print(endPoint)

 

 

오랜만에 문제를 풀다 보니 어떤 문제가 발생했을 때 어떤 방법으로 접근하는지에 대해서 감을 다 잃었다는 게 느껴졌다. 그래도 꾸준히 하다 보면 금방 감을 잡을 거라고 믿고 다시 파이팅!

728x90

'파이썬알고리즘' 카테고리의 다른 글

백준 23971 ZOAC 4 파이썬  (0) 2024.08.26
백준 10815 파이썬 (이진탐색, Binary Search)  (1) 2024.06.14
백준 6603 파이썬  (0) 2023.02.06
Baekjoon 2775 Python  (0) 2022.11.20
Baekjoon 5355 Python  (0) 2022.11.19