import sys
input = sys.stdin.readline
# 이진 탐색 함수
def bSearch(arr, t, s, e):
while s <= e: # 교차할때까지 반복
mid = (s + e) // 2 # 인덱스 중간값
if arr[mid] == t: # 리스트 중간이 타겟이면
return 1 # 1 리턴
elif arr[mid] > t: # 터겟보다 크면
e = mid - 1 # 끝 인덱스 값 조정
elif arr[mid] < t: # 타겟보다 작으면
s = mid + 1 # 시작 인덱스 값 조정
return 0 # 탐색이 끝났으면 없는 것
# 입력 받기
n = int(input())
li = sorted(list(map(int, input().split()))) # 오름차순 정렬
m = int(input())
targets = list(map(int, input().split()))
for t in targets:
print(bSearch(li, t, 0, n-1)) # 타겟들을 이진 탐색으로 탐색
문제풀이
핵심 개념과 풀이 흐름을 짧고 선명하게 정리했습니다.
import sys
input = sys.stdin.readline
# 이진 탐색 함수
def bSearch(arr, t, s, e):
result = 0 # 최적화 되는 나무 길이값을 저장할 변수
while s <= e: # s > e가 아니면 계속 반복
h = (s + e) // 2 # 중간 길이
t_len = 0 # 자른 나무들의 길이 합을 저장할 변수
for i in arr: # 모든 나무들을 반복하며
if i > h: # 기준 길이 보다 크면
t_len += i - h # 잘라진 값을 합함
if t_len > t: # 그 합이 타겟보다 크면
result = h # 조건을 만족하므로 결괏값에 저장
s = h + 1 # 덜 잘라봐야 하므로 높이를 절반 높이기 위해 조정
elif t_len < t: # 타겟 보다 작으면
e = h - 1 # 더 잘라야 하므로 높이를 절반 낮추기 위해 조정
else:
return h # 타겟과 일치하면 바로 반환 (최적화된 길이)
return result # 반복문이 종료되면 result에 남아 있는 값이 최적화 값
n, m = map(int, input().split()) # 나무 수, 타겟 길이 입력
th = sorted(list(map(int, input().split()))) # 나무 길이 리스트 입력
print(bSearch(th, m, 0, th[-1])) # 이진 탐색 결과 (절단기 최적화 높이 값) 출력