[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋ฌด์ง€์˜ ๋จน๋ฐฉ ๋ผ์ด๋ธŒ / ์šฐ์„ ์ˆœ์œ„ ํ(ํž™)
Problem Solving ๐Ÿ”ฅ/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋ฌด์ง€์˜ ๋จน๋ฐฉ ๋ผ์ด๋ธŒ / ์šฐ์„ ์ˆœ์œ„ ํ(ํž™)

https://programmers.co.kr/learn/courses/30/lessons/42891#

์šฐ์„ ์ˆœ์œ„ ํ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด foods_time์ด [3, 4, 5, 6, 7, 8, 9, 10] ์ด๋ผ๊ณ  ํ•ด๋ด…์‹œ๋‹ค.

์ด ์ •๋ณด๋งŒ ์ฃผ์–ด์กŒ์„ ๋•Œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ธ 3, ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด์˜ ๊ธธ์ด 7 ์ด๋‹ˆ

21์ดˆ ํ›„์—๋Š” [1, 2, 3, 4, 5, 6, 7] ์ด ๋จ์„ ์•Œ ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

์ฆ‰ N์ดˆ(๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ x ๋ฐฐ์—ด์˜ ๊ธธ์ด)ํ›„์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’, ๋ฐฐ์—ด์˜ ๊ธธ์ด๋กœ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ => ์šฐ์„ ์ˆœ์œ„ ํ ์ž„์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์กฐ๊ธˆ ํ’€์–ด๋ณด์‹  ๋ถ„๋“ค์€ ์‰ฝ๊ฒŒ ๋ˆˆ์น˜์ฑ„์…จ๊ฒ ์ฃ ??

๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ x ๋ฐฐ์—ด์˜ ๊ธธ์ด๋กœ ๊ณ„์† ์ ํ”„๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์ด ๊ฐ’์ด ์ด์ œ K์ดˆ ํ›„๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ ๋ฉˆ์ถฐ์ค๋‹ˆ๋‹ค.
๊ทธ ๋•Œ๋ถ€ํ„ฐ๋Š” ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ํ•œ ๋ฒˆ์— ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

import heapq

def solution(food_times, k):

    if sum(food_times) <= k:
        return -1

    food_times = [ (i, idx+1) for idx, i in enumerate(food_times) ]
    pq = []
    for f, idx in food_times:
        heapq.heappush(pq, (f, idx))

    cnt = 0
    prev = 0

    while cnt + (pq[0][0] - prev) * len(pq) < k:
        n = len(pq)
        if not pq:
            break
        f, idx = heapq.heappop(pq)
        cnt += n * (f - prev)
        prev = f

    q = []
    for f, idx in food_times:
        if f - prev > 0:
            q.append((f - prev, idx)) 
    return q[(k - cnt)%len(q)][1]