정렬
페이지
미리보기
이분 탐색매개 변수 탐색
자세히 보기
백준 1654번
import sys
input = sys.stdin.readline

def paramSearch(arr, t, s, e):
    result = 0                      # 최적값 담을 변수
    while s <= e:
        m = (s + e) // 2
        cnt = 0                     # 자른 랜선의 수 담을 변수
        for i in arr:               # 모든 랜선을
            cnt += i // m           # 설정한 절반 길이로 잘라 나온 갯수 더함
        if cnt >= t:                # 타겟 수보다 같거나 크면
            result = m              # 결괏값에 저장하고
            s = m + 1               # 더 길게 자를 수 있는지 확인을 위해 시작길이 올림
        else:                       # 타겟 수보다 작으면
            e = m - 1               # 더 잘게 자르기
    return result                   # 최적의 결과 반환

k, n = map(int, input().split())
li = []
for i in range(k):
    li.append(int(input()))
print(paramSearch(li, n, 1, max(li)))
# 0으로 나누는 문제(ZeroDivisionError) 발생으로 1부터
# 가장 긴 랜선의 길이 까지
이분 탐색매개 변수 탐색
자세히 보기
백준 2512번
import sys
input = sys.stdin.readline

def bSearch(arr, t, s, e):
    result = 0                              # 최적화 값 저장할 변수
    while s <= e:
        mid = (s + e) // 2                  # 시작 끝 액수의 중간값
        pSum = 0                            # 총액 넣을 변수
        for i in arr:
            pSum += mid if i > mid else i   # 예산에 따른 총액 계산
        if pSum > t:                        # 예산보다 크면
            e = mid - 1                     # 줄여서 반
        elif pSum < t:                      # 예산보다 작으면
            result = mid                    # 일단 해로 넣고
            s = mid + 1                     # 더 큰 반
        else:
            return mid                      # 상한값이면 바로 리턴
    return result                           # 최적화 값 리턴

n = int(input())
li = list(map(int, input().split()))
t = int(input())
print(bSearch(li, t, 0, max(li)))