1114번: 통나무 자르기
첫째 줄에 두 개의 수를 출력한다. 첫 번째 수는 가장 긴 조각의 길이이고, 두 번째 수는 그 때 처음 자르는 위치를 출력한다. 만약 가능한 것이 여러 가지라면, 처음 자르는 위치가 작은 것을 출
www.acmicpc.net
코드
l, k, c = map(int, input().split())
points = [0]+sorted(list(map(int, input().split())))+[l]
pieces = [points[i+1]-points[i] for i in range(k+1)]
longest = max(pieces)
def chk(length): # 최대 길이
if longest > length: # 가능한 최대 길이보다 더 긴 통나무가 있는 경우
return [10001, -1]
tmp = 0 # 통나무 조각 길이 합
cutting = 0 # 자른 횟수
for p in pieces[::-1]:
tmp += p
if tmp > length: # 이번 조각을 더하면 l보다 길어지게 되는 경우
cutting += 1
tmp = p # 새로운 조각 시작
return [cutting, tmp if cutting == c else pieces[0]]
# 매개 변수 탐색
s, e = 0, int(1e9)
ans = []
while s <= e:
mid = (s+e)//2
cutting, first = chk(mid)
if cutting <= c:
ans = [mid, first]
e = mid-1
else:
s = mid+1
print(*ans)
매개 변수 탐색에서 사용될 조건을 확인하기 위한 함수 chk(length)는 전체 통나무를 몇개의 조각으로 자를 수 있는지와 그 때 처음 자른 위치를 리턴한다.
만약 가능한 최대 길이 제한인 length보다 자를 수 있는 통나무 조각의 길이가 길다면 불가능하다는 뜻으로 [10001, -1]을 리턴해준다.
통나무의 왼쪽 끝이 아닌 오른쪽 끝부터 자르기 때문에 왼쪽에서 첫번째 조각 부분이 처음으로 통나무를 자른 위치라고 할 수 있다. 그런데 딱 C번 자른다면 첫번째 조각이 아닌 tmp가 왼쪽에서부터 첫번째로 통나무를 자른 위치라고 할 수 있다.
'문제풀이 > 이분탐색' 카테고리의 다른 글
[Python/파이썬] 백준 6236번 용돈 관리 (0) | 2024.05.25 |
---|---|
[Python/파이썬] 백준 15823번 카드 팩 구매하기 (0) | 2024.05.09 |
[Python/파이썬] 백준 2417번 정수 제곱근 (0) | 2024.04.01 |
[Python/파이썬] 백준 3273번 두 수의 합 (0) | 2024.02.27 |
[Python/파이썬] 백준 14575번 뒤풀이 (0) | 2024.02.17 |
1114번: 통나무 자르기
첫째 줄에 두 개의 수를 출력한다. 첫 번째 수는 가장 긴 조각의 길이이고, 두 번째 수는 그 때 처음 자르는 위치를 출력한다. 만약 가능한 것이 여러 가지라면, 처음 자르는 위치가 작은 것을 출
www.acmicpc.net
코드
l, k, c = map(int, input().split()) points = [0]+sorted(list(map(int, input().split())))+[l] pieces = [points[i+1]-points[i] for i in range(k+1)] longest = max(pieces) def chk(length): # 최대 길이 if longest > length: # 가능한 최대 길이보다 더 긴 통나무가 있는 경우 return [10001, -1] tmp = 0 # 통나무 조각 길이 합 cutting = 0 # 자른 횟수 for p in pieces[::-1]: tmp += p if tmp > length: # 이번 조각을 더하면 l보다 길어지게 되는 경우 cutting += 1 tmp = p # 새로운 조각 시작 return [cutting, tmp if cutting == c else pieces[0]] # 매개 변수 탐색 s, e = 0, int(1e9) ans = [] while s <= e: mid = (s+e)//2 cutting, first = chk(mid) if cutting <= c: ans = [mid, first] e = mid-1 else: s = mid+1 print(*ans)
매개 변수 탐색에서 사용될 조건을 확인하기 위한 함수 chk(length)는 전체 통나무를 몇개의 조각으로 자를 수 있는지와 그 때 처음 자른 위치를 리턴한다.
만약 가능한 최대 길이 제한인 length보다 자를 수 있는 통나무 조각의 길이가 길다면 불가능하다는 뜻으로 [10001, -1]을 리턴해준다.
통나무의 왼쪽 끝이 아닌 오른쪽 끝부터 자르기 때문에 왼쪽에서 첫번째 조각 부분이 처음으로 통나무를 자른 위치라고 할 수 있다. 그런데 딱 C번 자른다면 첫번째 조각이 아닌 tmp가 왼쪽에서부터 첫번째로 통나무를 자른 위치라고 할 수 있다.
'문제풀이 > 이분탐색' 카테고리의 다른 글
[Python/파이썬] 백준 6236번 용돈 관리 (0) | 2024.05.25 |
---|---|
[Python/파이썬] 백준 15823번 카드 팩 구매하기 (0) | 2024.05.09 |
[Python/파이썬] 백준 2417번 정수 제곱근 (0) | 2024.04.01 |
[Python/파이썬] 백준 3273번 두 수의 합 (0) | 2024.02.27 |
[Python/파이썬] 백준 14575번 뒤풀이 (0) | 2024.02.17 |