코딩테스트 연습
[파이썬] 프린터 출력 / 이진탐색
콩콩(๓° ˘ °๓)♡
2023. 3. 26. 16:18
문제
John과 Mary는 "J&M 출판사"를 설립하고 낡은 프린터 2대를 구입하였다.
그들이 첫번째로 성사시킨 거래는 N개의 페이지로 구성된 문서를 출력하는 일이었다.
그들이 구입한 두 대의 프린터는 각기 다른 속도록 문서를 출력하고 있다고 한다. 하나는 한 페이지를 출력하는 데 X초가 걸리고 다른 하나는 Y초가 소요된다고 한다.
John과 Mary는 두 대의 프린터를 이용하여 전체 문서를 출력하는 데 드는 최소한의 시간이 알고 싶어졌다.
-> 입력과 출력
입력데이터의 첫번 째 라인은 테스트케이스의 갯수를 뜻하고 그 갯수만큼의 라인이 추가로 입력된다.
추가되는 각 라인은 세 개의 정수값 X Y N 으로 구성된다. X는 첫번째 프린터가 한 페이지를 출력하는 데 드는 소요시간,
Y는 두번째 프린터가 한 페이지를 출력하는 데 드는 소요시간을 뜻하고
N은 출력할 문서의 총 페이지 수를 의미한다. (단, 출력할 문서의 총 페이지 수는 1,000,000,000개를 초과하지 않는다.)
두 가지 이진탐색을 작성했다.
1. 시간 기준 이진탐색
def solution(X, Y, N):
start=0
end=max(X,Y)*N
result=end
while start<end:
mid=(start+end)//2
pages=mid//X + mid//Y #mid시간에 출력되는 페이지 수
if pages<N:
start=mid+1
else:
end=mid-1
result=min(end, result)
return result
2. 페이지 기준 이진탐색
def BS(X, Y, N):
lower = 0
upper = N
while lower < upper:
if max(upper * X , (N - upper) * Y) < max(lower * X, (N - lower) * Y):
# upper 쪽이 더 유리한 상황
lower = (lower + upper + 1) // 2
else:
upper = (lower + upper) // 2
return max(upper * X, (N - upper) * Y)