문제풀이/이분탐색

[Python/파이썬] 백준 17393번 다이나믹 롤러

딜레이레이 2025. 1. 25. 22:32

https://www.acmicpc.net/problem/17393

코드

n = int(input())
inks = list(map(int, input().split()))
viscosities = list(map(int, input().split()))


def binary_search(start, target):
    l, r = start, n-1
    res = n-1
    while l <= r:
        mid = (l+r)//2
        if viscosities[mid] <= target:
            res = mid
            l = mid+1
        else:
            r = mid-1
    return res


ans = []
for i in range(n):
    ans.append(binary_search(i, inks[i])-i)

print(*ans)

 

칸이 최대 10^18개까지 존재하고, 점도지수가 오름차순으로 정렬된채로 주어지므로 이분탐색을 쓰라는 문제인 것을 알 수 있다.

 

현재 칸에서부터 오른쪽 끝칸 중에서 점도지수가 현재 칸의 잉크 지수(A_i) 이하인 칸을 찾으면 된다. 이때 예제 1의 10, 10, 10과 같이 점도지수가 같은 값이 연달아서 나오는 경우도 있으므로 이분탐색을 할 때 타겟값을 찾았다고 바로 리턴하면 안되고 최대한 탐색하도록 함수를 구현해야 한다.