728x90
반응형
1. 문제 설명
2. 풀이과정
해당 문제는 절단기의 높이를 조절하며 잘리는 나무의 길이를 구하여 정답을 도출하는 문제이다.
절단기의 높이는 0부터 자를 나무의 최대 높이 중 하나이다.최대한 빠르게 정답을 도출하기 위해 이진 탐색을 활용하여 절단기 높이를 구하였다.
- sys.stdin.readline() 함수를 사용하기 위해 sys 모듈을 불러온다. import sys
- 나무의 수와 가져갈 나무의 길이를 입력받는다. N, M = map(int, sys.stdin.readline().split())
- 나무들의 높이를 입력받아 리스트로 저장한다. height = list(map(int, sys.stdin.readline().split()))
- 절단기의 최소 높이를 저장할 변수를 생성하고 초기화한다. low = 0
- 절단기의 최고 높이를 저장할 변수를 생성하고 나무 높이 중 최댓값을 저장한다. high = max(height)
- 최소 높이가 최대 높이를 넘어가기 전까지 반복한다. while (low <= high)
- 최소 높이와 최대 높이의 중간 지점을 구한다. center = (low + high) // 2
- 나무를 하나씩 가져와 만약 중간 지점보다 길면 자른 나무의 길이를 저장하고 아니면 0을 저장한 리스트를 생성한다. result = [i - center if (i > center) else 0 for i in height]
- 만약 자른 나무의 길이의 총합이 가져갈 나무의 길이보다 같거나 크면 if (sum(result) >= M)
- 최소 높이를 중간 지점 다음 높이로 바꾼다. low = center + 1
- 반면에 자른 나무의 길이의 총합이 가져갈 나무의 길이보다 작으면 else
- 최대 높이를 중간 지점 이전 높이로 바꾼다. high = center - 1
- 최소 높이가 최대 높이를 넘어가면 최고 높이를 출력한다. print(high)
반응형
3. 소스코드
import sys
N, M = map(int, sys.stdin.readline().split())
height = list(map(int, sys.stdin.readline().split()))
low = 0
high = max(height)
while (low <= high):
center = (low + high) // 2
result = [i - center if (i > center) else 0 for i in height]
if (sum(result) >= M):
low = center + 1
else:
high = center - 1
print(high)
728x90
반응형
'백준' 카테고리의 다른 글
[백준] 11050번 : 이항 계수 1 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.09.12 |
---|---|
[백준] 3009번 : 네 번째 점 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.09.04 |
[백준] 1966번 : 프린터 큐 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.09.02 |
[백준] 11729번 : 하노이 탑 이동 순서 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.08.31 |
[백준] 2748번 : 피보나치 수 2 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.08.26 |
[백준] 1541번 : 잃어버린 괄호 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.08.21 |
[백준] 11727번 : 2xn 타일링 2 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.08.20 |
[백준] 2156번 : 포도주 시식 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.08.19 |