[백준/Python] 2805번 나무 자르기

2025. 2. 11. 14:22·알고리즘문제풀이

문제

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


문제풀이(시간초과)

# 시간초과
n, m = map(int, input().split())
tree = list(map(int, input().split()))
hap = 0

tree.sort()
max = tree[n-1]

while hap < m:
    hap = 0
    max -= 1
    for i in range(n):
        if tree[i] - max >= 0:
            hap += tree[i] - max
print(max)

 

처음 이 문제를 접했을 때는 나름 풀만하다고 생각해서 내 나름대로 반복문으로 풀어보았다.

혼자서 이것 저것 고치면서 풀고 난 후 백준에 답을 제출했는데 시간초과

 

시간초과를 해결할 방법은 이진탐색이었다. 


문제풀이(정답) : 이진탐색

# 이분탐색
n, m = map(int, input().split())
tree = list(map(int, input().split()))

start = 0
end = max(tree)
result = 0

while start <= end:
    mid = (start + end) // 2
    hap = sum(max(0, x - mid) for x in tree)

    if hap >= m:
        result = mid
        start = mid + 1
    else:
        end = mid - 1

print(result)

 

※ 이진탐색이란?

정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법이다.

 

따라서 시작점과 끝점, 중간점을 이용하여 문제를 풀었다.

 

tree의 합도 위에서와 다르게 한 줄로 깔끔하게 작성했다.

hap = sum(max(0, x - mid) for x in tree)
0보다 클 때만 합을 더한다는 코드를 max(0, 값)으로 사용했다.

 

 

저작자표시 비영리 변경금지 (새창열림)

'알고리즘문제풀이' 카테고리의 다른 글

[프로그래머스/Python] 실패율  (0) 2025.02.13
[백준/Python] 1002번 터렛  (0) 2025.02.12
[백준/Python] 18110번 solved.ac  (0) 2025.02.10
[백준/Python] 10610번 30  (0) 2025.02.07
[백준/Python] 14425번 문자열 집합  (0) 2025.02.06
'알고리즘문제풀이' 카테고리의 다른 글
  • [프로그래머스/Python] 실패율
  • [백준/Python] 1002번 터렛
  • [백준/Python] 18110번 solved.ac
  • [백준/Python] 10610번 30
jungyn
jungyn
jungyn 님의 블로그 입니다.
  • jungyn
    jungyn 님의 블로그
    jungyn
  • 전체
    오늘
    어제
    • 분류 전체보기 (36)
      • 알고리즘문제풀이 (31)
      • 제로인턴 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    2606
    2108
    2563
    SYS
    제로인턴
    2161
    1847
    다이나믹프로그래밍
    18110
    수들의 합 2
    11729
    백준
    스택 수열
    BFS
    너비우선탐색
    후기
    스택 2
    2차원행렬
    교점개수
    사전직무교육
    시간초과
    프로그래머스
    solved.ac
    카드1
    스택
    DP
    counter
    1629
    28278
    통계헉
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
jungyn
[백준/Python] 2805번 나무 자르기
상단으로

티스토리툴바