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