λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸƒ algorithm/boj

BOJ 15732 - 도토리 숨기기

by HandHand 2021. 3. 18.

문제

λ°±μ€€ 온라인 저지 - 15732번

풀이 κ³Όμ •

μΌμ •ν•œ κ°„κ²©μœΌλ‘œ 도토리가 λ†“μ—¬μžˆλ‹€κ³  ν–ˆμ„ λ•Œ νŠΉμ • μˆœμ„œμ˜ 도토리가 λ“€μ–΄μžˆλŠ” μƒμžμ˜ μœ„μΉ˜λ₯Ό μ°ΎλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

λ§Œμ•½ 주어진 κ·œμΉ™λ“€μ„ λͺ¨λ‘ μˆ˜ν–‰ν•΄λ³΄κ³  λ„ν† λ¦¬μ˜ μœ„μΉ˜λ₯Ό μ°ΎλŠ” 브루트 포슀 λ₯Ό μˆ˜ν–‰ν•œλ‹€λ©΄
μ΅œμ•…μ˜ 경우 O(NK) 이기 λ•Œλ¬Έμ— μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν•©λ‹ˆλ‹€.

λŒ€μ‹ μ— μƒν•œκ³Ό ν•˜ν•œμ„ μ„€μ •ν•œ λ’€ 이뢄 탐색 을 ν™œμš©ν•΄μ„œ λ§ˆμ§€λ§‰ 도토리가 μžˆλŠ” μƒμžμ˜ μœ„μΉ˜λ₯Ό 찾도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.
각각의 μœ„μΉ˜μ—μ„œ ν•΄λ‹Ή 지점이 λ§ˆμ§€λ§‰ λ„ν† λ¦¬λΌλŠ” 사싀을 μ–΄λ–»κ²Œ νŒλ‹¨ν•  수 μžˆμ„κΉŒμš”?
μ΄λŠ” λ°”λ‘œ 각 κ·œμΉ™μ„ λͺ¨λ‘ μˆœνšŒν•˜λ©΄μ„œ νŠΉμ • 지점 x 보닀 μ•žμ— μžˆλŠ” λ„ν† λ¦¬μ˜ 개수λ₯Ό μ„Έμ–΄μ£Όλ©΄ λ©λ‹ˆλ‹€.
각 κ·œμΉ™μ˜ μ‹œμž‘ μœ„μΉ˜λ₯Ό init , 간격을 step , κΈ°μ€€ 지점을 x 라고 ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같은 뢀등식이 μ„±λ¦½ν•©λ‹ˆλ‹€.


init + step * a <= x


μ—¬κΈ°μ„œ a λŠ” step 의 개수이며 a + 1 이 x 와 κ°™κ±°λ‚˜ μž‘μ€ μ›μ†Œμ˜ κ°œμˆ˜κ°€ λ©λ‹ˆλ‹€.

μ½”λ“œ



import sys


N, K, D = list(map(int, sys.stdin.readline().split()))
rules = [list(map(int, sys.stdin.readline().split())) for _ in range(K)]


def dotori(pivot):
    total = 0
    for start, end, step in rules:
        beta = min(end, pivot)
        if start <= beta:
            calc = (beta - start) // step + 1
            total += calc

    return total


def solution():
    lo, hi = 1, 1000000

    ans = 0
    while lo <= hi:
        mid = (lo + hi) // 2

        if dotori(mid) >= D:
            ans = mid
            hi = mid - 1
        else:
            lo = mid + 1

    return ans


print(solution())

λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€