[これがコードテスト]バイナリ探索-トッポッキ作り
4513 ワード
バイナリナビゲーション
検索するデータと中間位置にあるデータを繰り返し比較して、必要なデータを検索します.
に質問
一包みに入った餅の全長をカッターで切り分けて合わせます.切り餅機に高さ(H)を指定すると、一度に一列に切り分けることができます.お客様が来たときに、要求される全長がMであれば、少なくともMのお菓子を得るために、カッターが設定できる最高高さの値を求めるプログラムを作成してください.
入力例
4 6
19 15 10 17
出力例
15
💻 コード#コード#
1~最長ケーキの長さをバイナリナビゲーションノードに設定し、カッターの高さを中間値にします.中間値を基準として、お客様が要求する全長と一致する場合は、中間値を切り餅の高さに設定します.
問題を解く
カッターの高さHを繰り返し調整することがこの問題の核心である.
シーケンシャルナビゲーションは可能ですが、カッターの高さは1~20,000,000,000,000,000であるため、シーケンシャルナビゲーションはタイムアウトします.
📝 整理する
入力条件が1億個を超えると,シーケンス探索よりバイナリ探索を思い出す.
検索するデータと中間位置にあるデータを繰り返し比較して、必要なデータを検索します.
に質問
一包みに入った餅の全長をカッターで切り分けて合わせます.切り餅機に高さ(H)を指定すると、一度に一列に切り分けることができます.お客様が来たときに、要求される全長がMであれば、少なくともMのお菓子を得るために、カッターが設定できる最高高さの値を求めるプログラムを作成してください.
入力例
4 6
19 15 10 17
出力例
15
💻 コード#コード#
# 1부터 가장 긴 떡의 길이까지 이진 탐색. 중간값을 절단기에 설정한 높이
# target은 요청한 길이 M
def binary_search(array, target, start, end):
while start <= end:
mid = (start + end) // 2
total_length = 0
for i in array:
if i > mid:
total_length += i - mid
if total_length == target:
return mid
# 절단한 떡의 총 길이가 요청한 길이보다 길다면 높이가 더 커야한다.
elif total_length > target:
start = mid + 1
else:
end = mid - 1
total_length = 0
N, M = map(int, input().split())
array = list(map(int, input().split()))
print(binary_search(array), 6, 1, max(array))
デザイン1~最長ケーキの長さをバイナリナビゲーションノードに設定し、カッターの高さを中間値にします.中間値を基準として、お客様が要求する全長と一致する場合は、中間値を切り餅の高さに設定します.
問題を解く
カッターの高さHを繰り返し調整することがこの問題の核心である.
シーケンシャルナビゲーションは可能ですが、カッターの高さは1~20,000,000,000,000,000であるため、シーケンシャルナビゲーションはタイムアウトします.
📝 整理する
入力条件が1億個を超えると,シーケンス探索よりバイナリ探索を思い出す.
Reference
この問題について([これがコードテスト]バイナリ探索-トッポッキ作り), 我々は、より多くの情報をここで見つけました https://velog.io/@xxwb__/이것이-코딩-테스트다-이진-탐색-떡볶이-떡-만들기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol