🔊본 포스팅은 '(이코테 2021) 이것이 취업을 위한 코딩 테스트다 with 파이썬' 유튜브 강의를 수강하고 정리한 글입니다.
- 전형적인 이진 탐색 문제이자, 파라메트릭 서치 유형의 문제이다.
- 코딩 테스트나 프로그래밍 대회에서는 보통 파라메트릭 서치 유형은 이진 탐색을 이용하여 해결한다.
[Step 1]
시작점: 0, 끝점: 19, 중간점: 9
이때 필요한 떡의 크기: M=6이므로, 결과 저장
→ 0과 19 사이의 중간점 9를 절단기 높이 H로 설정하면 얻을 수 있는 떡의 합은 (10+6+1+8)=25이다. 필요한 떡의 길이가 6보다 크기 때문에 시작점을 증가시킨다.
[Step 2]
시작점: 10, 끝점: 19, 중간점: 14
이때 필요한 떡의 크기: M=6이므로, 결과 저장
→ 절단기 높이를 14로 설정하면 얻을 수 있는 떡의 합이 (5+1+3)=9이다. 여전히 필요한 떡의 길이인 6보다 크기 때문에 시작점을 증가시킨다.
[Step 3]
시작점: 15, 끝점: 19, 중간점: 17
이때 필요한 떡의 크기: M=6이므로, 결과 저장하지 않음
→ 필요한 떡의 길이인 6보다 작기 때문에 끝점을 감소시킨다.
[Step 4]
시작점: 15, 끝점: 16, 중간점: 15
이때 필요한 떡의 크기: M=6이므로, 결과 저장
- 이러한 이진 탐색 과정을 반복하면 답을 도출할 수 있다.
- 중간점의 값은 시간이 지날수록 '최적화된 값'이 되기 때문에, 과정을 반복하면서 얻을 수 있는 떡의 길이 합이 필요한 떡의 길이보다 크거나 같을 때마다 중간점의 값을 기록하면 된다.
# 떡의 개수(N)와 요청한 떡의 길이(M)을 입력
n, m = list(map(int, input().split(' ')))
# 각 떡의 개별 높이 정보를 입력
array = list(map(int, input().split()))
# 이진 탐색을 위한 시작점과 끝점 설정
start = 0
end = max(array)
# 이진 탐색 수행(반복적)
result = 0
while(start<=end):
total = 0
mid = (start+end)//2
for x in array:
# 잘랐을 때의 떡의 양 계산
if x>mid:
total += x-mid
# 떡의 양이 부족한 경우 더 많이 자르기(왼쪽 부분 탐색)
if total<m:
end = mid-1
# 떡의 양이 충분한 경우 덜 자르기(오른쪽 부분 탐색)
else:
result = mid # 최대한 덜 잘랐을 때가 정답이므로, 여기에서 result에 기록
start = mid+1
# 정답 출력
print(result)
from bisect import bisect_left, bisect_right
# 값이 [left_value, right_value]인 데이터의 개수를 반환하는 함수
def count_by_range(array, left_value, right_value):
right_index = bisect_right(array, right_value)
left_index = bisect_left(array, left_value)
return right_index-left_index
n, x = map(int, input().split()) # 데이터의 개수 N, 찾고자 하는 값 x 입력받기
array = list(map(int, input().split())) # 전체 데이터 입력받기
# 값이 [x,x] 범위에 있는 데이터의 개수 계산
count = count_by_range(array,x,x)
# 값이 x인 원소가 존재하지 않는다면
if count == 0:
print(-1)
# 값이 x인 원소가 존재한다면
else:
print(count)