Algorithm/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค / PythonํŒŒ์ด์ฌ] ๋ฌด์ง€์˜ ๋จน๋ฐฉ ๋ผ์ด๋ธŒ

meeeeejin 2021. 7. 21. 19:47

๋ฌธ์ œ ๋งํฌ: https://programmers.co.kr/learn/courses/30/lessons/42891

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋ฌด์ง€์˜ ๋จน๋ฐฉ ๋ผ์ด๋ธŒ

 

programmers.co.kr

 

 

๋ฌธ์ œ ์„ค๋ช…

* ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ์— ๋ถ€๋ถ„ ์ ์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

ํ‰์†Œ ์‹์š•์ด ์™•์„ฑํ•œ ๋ฌด์ง€๋Š” ์ž์‹ ์˜ ์žฌ๋Šฅ์„ ๋ฝ๋‚ด๊ณ  ์‹ถ์–ด ์กŒ๊ณ  ๊ณ ๋ฏผ ๋์— ์นด์นด์˜ค TV ๋ผ์ด๋ธŒ๋กœ ๋ฐฉ์†ก์„ ํ•˜๊ธฐ๋กœ ๋งˆ์Œ๋จน์—ˆ๋‹ค.

๊ทธ๋ƒฅ ๋จน๋ฐฉ์„ ํ•˜๋ฉด ๋‹ค๋ฅธ ๋ฐฉ์†ก๊ณผ ์ฐจ๋ณ„์„ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์ง€๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋…ํŠนํ•œ ๋ฐฉ์‹์„ ์ƒ๊ฐํ•ด๋ƒˆ๋‹ค.

ํšŒ์ „ํŒ์— ๋จน์–ด์•ผ ํ•  N ๊ฐœ์˜ ์Œ์‹์ด ์žˆ๋‹ค.
๊ฐ ์Œ์‹์—๋Š” 1๋ถ€ํ„ฐ N ๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด์žˆ์œผ๋ฉฐ, ๊ฐ ์Œ์‹์„ ์„ญ์ทจํ•˜๋Š”๋ฐ ์ผ์ • ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.
๋ฌด์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์Œ์‹์„ ์„ญ์ทจํ•œ๋‹ค.

  • ๋ฌด์ง€๋Š” 1๋ฒˆ ์Œ์‹๋ถ€ํ„ฐ ๋จน๊ธฐ ์‹œ์ž‘ํ•˜๋ฉฐ, ํšŒ์ „ํŒ์€ ๋ฒˆํ˜ธ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์Œ์‹์„ ๋ฌด์ง€ ์•ž์œผ๋กœ ๊ฐ€์ ธ๋‹ค ๋†“๋Š”๋‹ค.
  • ๋งˆ์ง€๋ง‰ ๋ฒˆํ˜ธ์˜ ์Œ์‹์„ ์„ญ์ทจํ•œ ํ›„์—๋Š” ํšŒ์ „ํŒ์— ์˜ํ•ด ๋‹ค์‹œ 1๋ฒˆ ์Œ์‹์ด ๋ฌด์ง€ ์•ž์œผ๋กœ ์˜จ๋‹ค.
  • ๋ฌด์ง€๋Š” ์Œ์‹ ํ•˜๋‚˜๋ฅผ 1์ดˆ ๋™์•ˆ ์„ญ์ทจํ•œ ํ›„ ๋‚จ์€ ์Œ์‹์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ , ๋‹ค์Œ ์Œ์‹์„ ์„ญ์ทจํ•œ๋‹ค.
    • ๋‹ค์Œ ์Œ์‹์ด๋ž€, ์•„์ง ๋‚จ์€ ์Œ์‹ ์ค‘ ๋‹ค์Œ์œผ๋กœ ์„ญ์ทจํ•ด์•ผ ํ•  ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฒˆํ˜ธ์˜ ์Œ์‹์„ ๋งํ•œ๋‹ค.
  • ํšŒ์ „ํŒ์ด ๋‹ค์Œ ์Œ์‹์„ ๋ฌด์ง€ ์•ž์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

๋ฌด์ง€๊ฐ€ ๋จน๋ฐฉ์„ ์‹œ์ž‘ํ•œ ์ง€ K ์ดˆ ํ›„์— ๋„คํŠธ์›Œํฌ ์žฅ์• ๋กœ ์ธํ•ด ๋ฐฉ์†ก์ด ์ž ์‹œ ์ค‘๋‹จ๋˜์—ˆ๋‹ค.
๋ฌด์ง€๋Š” ๋„คํŠธ์›Œํฌ ์ •์ƒํ™” ํ›„ ๋‹ค์‹œ ๋ฐฉ์†ก์„ ์ด์–ด๊ฐˆ ๋•Œ, ๋ช‡ ๋ฒˆ ์Œ์‹๋ถ€ํ„ฐ ์„ญ์ทจํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์•Œ๊ณ ์ž ํ•œ๋‹ค.
๊ฐ ์Œ์‹์„ ๋ชจ๋‘ ๋จน๋Š”๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„์ด ๋‹ด๊ฒจ์žˆ๋Š” ๋ฐฐ์—ด food_times, ๋„คํŠธ์›Œํฌ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ๊ฐ„ K ์ดˆ๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ ๋ช‡ ๋ฒˆ ์Œ์‹๋ถ€ํ„ฐ ๋‹ค์‹œ ์„ญ์ทจํ•˜๋ฉด ๋˜๋Š”์ง€ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜๋ผ.

 

์ œํ•œ์‚ฌํ•ญ

  • food_times ๋Š” ๊ฐ ์Œ์‹์„ ๋ชจ๋‘ ๋จน๋Š”๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„์ด ์Œ์‹์˜ ๋ฒˆํ˜ธ ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด์ด๋‹ค.
  • k ๋Š” ๋ฐฉ์†ก์ด ์ค‘๋‹จ๋œ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ๋งŒ์•ฝ ๋” ์„ญ์ทจํ•ด์•ผ ํ•  ์Œ์‹์ด ์—†๋‹ค๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.

์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ ์ œํ•œ ์‚ฌํ•ญ

  • food_times ์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 2,000 ์ดํ•˜์ด๋‹ค.
  • food_times ์˜ ์›์†Œ๋Š” 1 ์ด์ƒ 1,000 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.
  • k๋Š” 1 ์ด์ƒ 2,000,000 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.

ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ ์ œํ•œ ์‚ฌํ•ญ

  • food_times ์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 200,000 ์ดํ•˜์ด๋‹ค.
  • food_times ์˜ ์›์†Œ๋Š” 1 ์ด์ƒ 100,000,000 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.
  • k๋Š” 1 ์ด์ƒ 2 x 10^13 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

food_times k result
[3, 1, 2] 5 1

 

 

 

๋ฌธ์ œ ํ’€์ด

์ฒ˜์Œ์— (food_time, ์Œ์‹ ๋ฒˆํ˜ธ)๋ฅผ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ์–ด์„œ ๋จน๋Š”๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„์ด ์งง์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์•„์ด๋””์–ด๊นŒ์ง„ ๋– ์˜ฌ๋ ธ๋‹ค. food_time์ด ์ž‘์€ ์ˆœ์„œ๋Œ€๋กœ ์Œ์‹์„ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ๋งŒ์•ฝ ๊ทธ ์Œ์‹์„ ๋‹ค ๋จน๋Š”๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์ด K๋ณด๋‹ค ํฌ๋‹ค๋ฉด, ๊ทธ๋•Œ ๋ช‡ ๋ฒˆ์งธ ์Œ์‹์„ ๋‹ค์‹œ ์„ญ์ทจํ•ด์•ผ ๋˜๋Š”์ง€ ๊ณ„์‚ฐํ•˜๋„๋ก ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์‹คํŒจํ–ˆ๋‹ค.. ์Œ์‹์„ ๋จน๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ ๊ณ„์‚ฐ์„ ์ž˜๋ชปํ•ด์„œ ๊ณ„์† ์˜ค๋‹ต์ฒ˜๋ฆฌ๊ฐ€ ๋๋‹ค..ใ… ใ…  ๋‚จ์€ ์Œ์‹์˜ ์–‘์„ ๊ณ„์‚ฐํ•  ๋•Œ ์‹œ๊ฐ„์œผ๋กœ ๊ณ„์‚ฐํ•˜์ง€ ๋ง๊ณ  ํšŒ์ „ํŒ์ด ํšŒ์ „ํ•˜๋Š” ํšŸ์ˆ˜๋กœ ๊ณ„์‚ฐํ–ˆ์–ด์•ผ ํ•˜๋Š”๋ฐ ๊ทธ ๋ถ€๋ถ„์—์„œ ์‹ค์ˆ˜๋ฅผ ํ–ˆ๋‹ค. 

 

์•„์ด๋””์–ด: (food_time, ์Œ์‹ ๋ฒˆํ˜ธ)๋ฅผ heap์— ๋„ฃ๊ณ  food_time์ด ์งง์€ ์Œ์‹๋ถ€ํ„ฐ ์‚ญ์ œํ•˜์ž!

 

1. ๋ชจ๋“  ์Œ์‹์— ๋Œ€ํ•ด (food_time, ์Œ์‹ ๋ฒˆํ˜ธ)๋ฅผ heap์— ์‚ฝ์ž…ํ•œ๋‹ค. 

2. food_time์ด ์งง์€ ์Œ์‹๋ถ€ํ„ฐ ์Œ์‹์„ ๋จน๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•œ๋‹ค. 

   - ์Œ์‹์„ ๋จน๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„: (๋‚จ์€ ์Œ์‹ ์–‘) * (๋‚จ์€ ์Œ์‹ ๊ฐœ์ˆ˜)

   - ๋‚จ์€ ์Œ์‹ ์–‘: ํ˜„์žฌ food_time - ์ด์ „์— ์ œ๊ฑฐํ•œ food_time

3. ํ˜„์žฌ ์Œ์‹์„ ๋‹ค ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์Œ์‹์„ ์ œ๊ฑฐํ•œ๋‹ค. 
   - ๋‚จ์€ ์‹œ๊ฐ„(k)์—์„œ ํ˜„์žฌ ์Œ์‹์„ ๋จน๋Š” ์‹œ๊ฐ„์„ ๋บ€๋‹ค. 

   - ์ด์ „์— ์ œ๊ฑฐํ•œ food_time๊ณผ ๋‚จ์€ ์Œ์‹ ๊ฐœ์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค. 

4. ํ˜„์žฌ ์Œ์‹์„ ๋‹ค ๋จน์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋‚จ์€ ์Œ์‹ ์ค‘์—์„œ ๋‹ค์Œ์— ๋จน์–ด์•ผ ํ•  ์Œ์‹ ๋ฒˆํ˜ธ๋ฅผ ๊ตฌํ•œ๋‹ค. 

   - heap์— ๋‚จ์•„์žˆ๋Š” ์Œ์‹ ๋ฒˆํ˜ธ ์ค‘์— (k + 1)๋ฒˆ์งธ ๋ฒˆํ˜ธ๋ฅผ ์ฐพ๋Š”๋‹ค. 
   - k๋Š” ๋‚จ์•„ ์žˆ๋Š” ์Œ์‹ ๊ฐœ์ˆ˜๋ณด๋‹ค ํด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ (k % ๋‚จ์€ ์Œ์‹ ๊ฐœ์ˆ˜)๋กœ ๋ฒˆํ˜ธ๋ฅผ ์ฐพ๋Š”๋‹ค. 

 

 

 

์†Œ์Šค์ฝ”๋“œ

# ๋ฌด์ง€์˜ ๋จน๋ฐฉ ๋ผ์ด๋ธŒ
import heapq


def solution(food_times, k):
    answer = -1
    h = []
    for i in range(len(food_times)):
        heapq.heappush(h, (food_times[i], i + 1))

    food_num = len(food_times)  # ๋‚จ์€ ์Œ์‹ ๊ฐœ์ˆ˜
    previous = 0  # ์ด์ „์— ์ œ๊ฑฐํ•œ ์Œ์‹์˜ food_time

    while h:
        # ๋จน๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„: (๋‚จ์€ ์–‘) * (๋‚จ์€ ์Œ์‹ ๊ฐœ์ˆ˜)
        t = (h[0][0] - previous) * food_num
        # ์‹œ๊ฐ„์ด ๋‚จ์„ ๊ฒฝ์šฐ ํ˜„์žฌ ์Œ์‹ ๋นผ๊ธฐ
        if k >= t:
            k -= t
            previous, _ = heapq.heappop(h)
            food_num -= 1
        # ์‹œ๊ฐ„์ด ๋ถ€์กฑํ•  ๊ฒฝ์šฐ(์Œ์‹์„ ๋‹ค ๋ชป๋จน์„ ๊ฒฝ์šฐ) ๋‚จ์€ ์Œ์‹ ์ค‘์— ๋จน์–ด์•ผ ํ•  ์Œ์‹ ์ฐพ๊ธฐ
        else:
            idx = k % food_num
            h.sort(key=lambda x: x[1])
            answer = h[idx][1]
            break

    return answer

 

 

 

728x90