๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿƒ 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())

๋ฐ˜์‘ํ˜•

๐Ÿ’ฌ ๋Œ“๊ธ€