[Baekjoon Online Judge] 백준 2805번 나무 자르기
(Python)
(글쓴날 : 2020.04.04)
* Baekjoon Online Judge, 백준 2805번 문제 Python 언어 풀이입니다.
* 소스 코드의 저작권은 글쓴이에게 있습니다.
백준 2805번 나무 자르기
1) 문제
문제 링크 : https://www.acmicpc.net/problem/2805
2805번: 나무 자르기
문제 상근이는 나무 M미터가 필요하다. 근처에 나무를 구입할 곳이 모두 망해버렸기 때문에, 정부에 벌목 허가를 요청했다. 정부는 상근이네 집 근처의 나무 한 줄에 대한 벌목 허가를 내주었고, 상근이는 새로 구입한 목재절단기를 이용해서 나무를 구할것이다. 목재절단기는 다음과 같이 동작한다. 먼저, 상근이는 절단기에 높이 H를 지정해야 한다. 높이를 지정하면 톱날이 땅으로부터 H미터 위로 올라간다. 그 다음, 한 줄에 연속해있는 나무를 모두 절단해버린다. 따
www.acmicpc.net
2) 풀이 과정
나무들의 높이가 주어지고, 각 나무들을 절단기를 통해 같은 높이로 자를 때 원하는 나무의 길이를 만족하는 절단기 높이의 최댓값을 출력하는 문제입니다.
저의 경우, 이분 탐색 알고리즘인 파라메트릭 서치를 적용하여 문제를 해결했습니다.
먼저, 나무의 최저 높이와 최고 높이를 구해, 최저 높이가 최고 높이 보다 작거나 같을 때까지 반복문을 돌리고 해당 값들의 중간 값을 절단기의 높이로 지정합니다.
만약, 절단한 나무길이의 합이 원하는 길이 보다 작다면 최고 높이를 중간값 - 1로 지정해 다시 반복하고, 크다면 가장 큰 중간값을 갱신해 저장한 뒤 최저 높이를 중간값 + 1로 지정하여 반복합니다.
그렇게 계속 반복하다가 만약 원하는 나무길이와 딱 떨어진다면 해당 중간값이 절단기에 설정할 수 있는 최댓값이므로 출력 후 바로 종료하고, 그렇지 않고 반복문을 빠져나왔다면 저장되어 있는 가장 큰 중간값이 절단기에 설정할 수 있는 최댓값이 됩니다.
제 방식은 Python 3로 제출 시 시간 초과가 발생하며, PyPy3로 제출 시 정답으로 인정됩니다.
요새 들어, PS 언어를 Python에서 C++로 갈아타야 하나 고민이 됩니다...
3) 코드
* Python 코드(PyPy3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
trees = list(map(int, input().split()))
left = 0
right = max(trees)
maxCut = 0
while left <= right:
getTree = 0
mid = (left + right) // 2
for tree in trees:
if tree - mid < 0:
continue
getTree += tree - mid
if getTree == M:
print(mid)
sys.exit()
elif getTree < M:
right = mid - 1
else:
if maxCut < mid:
maxCut = mid
left = mid + 1
print(maxCut)
|
'Deprecated' 카테고리의 다른 글
[Baekjoon Online Judge] 백준 2512번 예산(Python) (0) | 2020.04.06 |
---|---|
[Baekjoon Online Judge] 백준 1654번 랜선 자르기(Python) (0) | 2020.04.06 |
[Baekjoon Online Judge] 백준 9663번 N-Queen(Python) (1) | 2020.04.04 |
[Baekjoon Online Judge] 백준 14888번 연산자 끼워넣기(Python) (5) | 2020.04.03 |
[Baekjoon Online Judge] 백준 15652번 N과 M (4)(Python) (0) | 2020.04.02 |