Algorithm Problem/Python

[python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - λ¬΄μ§€μ˜ λ¨Ήλ°© 라이브(2019 KAKAO BLIND RECRUITMENT)

deo2kim 2020. 9. 11. 22:42
λ°˜μ‘ν˜•

πŸ€”λ¬Έμ œ ν•΄κ²°

Lv4 | μš°μ„ μˆœμœ„ 큐?

 

κ°€μž₯ 처음 μƒκ°λ‚œκ±΄ μ—­μ‹œ 1μ΄ˆμ”© μ „λΆ€ λŒμ•„λ³΄μž!!

ν•˜μ§€λ§Œ μ—­μ‹œλ‚˜ μ‹œκ°„μ΄ˆκ³Ό λ°œμƒ πŸ˜‚πŸ€£

 

μŒμ‹μ„ ν•œκΊΌλ²ˆμ— λΊ„μˆœ μ—†μ„κΉŒ μƒκ°ν•΄μ„œ κ°€μž₯ 적은 μŒμ‹μ˜ 수만큼 사이클을 돌기둜 ν–ˆλ‹€.

예λ₯Ό λ“€μ–΄ μŒμ‹μ΄ [ 5,5,3,3,6 ] 이라면 3만큼 ν•œκΊΌλ²ˆμ— λŒμ•„μ£ΌλŠ” 것이닀.

μŒμ‹μ΄ 3만큼 있고, 전체 길이가 5 μ΄λ―€λ‘œ, 15초 λ’€μ—λŠ” [ 2,2,0,0,3 ] 이 λœλ‹€κ³   μƒμƒλ§Œ!!!  직접 λΉΌμ£Όκ³  ν•˜λ©΄ μ‹œκ°„ 초과 

λ‹€μŒμ€ 2만큼 있고, 전체 길이가 3 μ΄λ―€λ‘œ (0은 μ·¨κΈ‰ μ•ˆν•¨), 6 초 λ’€μ—λŠ” [ 0,0,0,0,1 ] μ—­μ‹œ μƒμƒλ§Œ ν•˜μž

 

μœ„μ˜ 방법 처럼 ν•œκΊΌλ²ˆμ— λΉΌμ£ΌλŠ”λ° κ°€μž₯ 적은 μŒμ‹μ€ μ–΄λ–»κ²Œ κΊΌλ‚΄λƒν•˜λ©΄ 

λ°”λ‘œ νž™νλ₯Ό μ“°μž. νž™νμ— μŒμ‹μ˜ μ–‘κ³Ό ν•΄λ‹Ή μŒμ‹μ˜ 번호λ₯Ό μ°¨λ‘€λ‘œ λ„£μœΌλ©΄ κ°€μž₯ μž‘μ€ μŒμ‹μ„ κΊΌλ‚Ό 수 μžˆλ‹€.

 

μ €λ ‡κ²Œ 계속 전체 k μ΄ˆμ—μ„œ λΉΌμ£Όλ‹€κ°€ k초λ₯Ό λ„˜μ–΄κ°€κ²Œ λœλ‹€λ©΄ λ„˜μ–΄κ°€κΈ° λ°”λ‘œ μ§μ „κΉŒμ§€μ˜ μ‹œκ°„μ΄ˆλ§Œ μ„Όλ‹€.

남은 μ‹œκ°„μ΄ˆλ‘œ νž™νμ•ˆμ— 남은 μŒμ‹λ“€μ„ λŒμ•„μ£Όλ©΄ 끝!!!!!!!

 

πŸ’¨ μ΄μƒν•œ λ°©λ²•μœΌλ‘œ λ‚œμž‘ν•˜κ²Œ 풀어도 정확성이 떨어진닀..μ‹€μ œ μ½”ν…Œ 상황이라면 λˆˆλ¬Όμ„ 머금고 λ‹€μŒλ¬Έμ œλ‘œ λ„˜μ–΄κ°€μžπŸ˜‚

 

πŸ’»μ†ŒμŠ€ μ½”λ“œ

import heapq


def solution(food_times, k):
    n = len(food_times)  # 전체길이
    pq = []  # νž™ν 넣을 κ³³
    for i in range(n):  # νž™ν λ„£μ–΄μ€Œ ( μŒμ‹μ–‘, 번호 )
        heapq.heappush(pq, (food_times[i], i + 1))

    pre_food = 0  # κ°€μž₯ λ°‘λ°”λ‹₯
    min_food = pq[0][0]  # ν˜„μž¬ μŒμ‹μ€‘ κ°€μž₯ μž‘μ€ 녀석
    
    # 사이클 λŒλ©΄μ„œ kμ—μ„œ μ‹œκ°„μ„ 계속 λΉΌμ€€λ‹€.
    while True:
        # 사이클 λŒμ•˜μ„ λ•Œ k κ°€ μŒμˆ˜κ°€ 되면 빼주지 말고 λ‚˜μ˜€μž
        if k - (min_food - pre_food) * n < 0:
            break
        
        # μ•„λ‹ˆλΌλ©΄ k λΉΌμ£Όκ³ 
        k -= (min_food - pre_food) * n
        
        # νž™νμ—μ„œλ„ κ·Έ μŒμ‹μ„ λΉΌμ€€λ‹€.
        heapq.heappop(pq)
        pre_food = min_food  # λ°”λ‹₯은 방금 κ·Έ μŒμ‹μ˜ 양이닀.
        n -= 1  # 전체 길이도 ν•˜λ‚˜ λΉΌμ€€λ‹€.

        # λ§Œμ•½ λ‹€ λ¨Ήμ—ˆλŠ”λ°λ„ kκ°€ λ‚¨μ•„μžˆλ‹€λ©΄
        # μŒμ‹μ΄ λΆ€μ‘±ν•œ μƒνƒœμ΄λ―€λ‘œ
        if not pq:  
            return -1
        
        # 이것을 λ‚˜μ€‘μ— ν•΄μ£ΌλŠ” μ΄μœ λŠ” μœ„μ—μ„œ λΉ„μ–΄μžˆμ„ 경우 인덱슀 μ—λŸ¬κ°€ λ‚˜κΈ° λ•Œλ¬Έ
        min_food = pq[0][0]
    
    # 전체 길이보닀 남은 μ΄ˆκ°€ 더 λ§Žμ„ 수 μžˆμœΌλ―€λ‘œ
    # 초λ₯Ό 길이둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€κ°€ 닡이닀.
    idx = k % n
    # λ‹€μ‹œ 번호 순으둜 μ •λ ¬ ν•΄μ£Όκ³ 
    pq.sort(key=lambda x: x[1])
    answer = pq[idx][1]
    return answer

 

πŸ“•λ¬Έμ œ 확인

좜처: ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

링크: 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

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1

  • 0~1초 λ™μ•ˆμ— 1번 μŒμ‹μ„ μ„­μ·¨ν•œλ‹€. 남은 μ‹œκ°„μ€ [2,1,2] 이닀.
  • 1~2초 λ™μ•ˆ 2번 μŒμ‹μ„ μ„­μ·¨ν•œλ‹€. 남은 μ‹œκ°„μ€ [2,0,2] 이닀.
  • 2~3초 λ™μ•ˆ 3번 μŒμ‹μ„ μ„­μ·¨ν•œλ‹€. 남은 μ‹œκ°„μ€ [2,0,1] 이닀.
  • 3~4초 λ™μ•ˆ 1번 μŒμ‹μ„ μ„­μ·¨ν•œλ‹€. 남은 μ‹œκ°„μ€ [1,0,1] 이닀.
  • 4~5초 λ™μ•ˆ (2번 μŒμ‹μ€ λ‹€ λ¨Ήμ—ˆμœΌλ―€λ‘œ) 3번 μŒμ‹μ„ μ„­μ·¨ν•œλ‹€. 남은 μ‹œκ°„μ€ [1,0,0] 이닀.
  • 5μ΄ˆμ—μ„œ λ„€νŠΈμ›Œν¬ μž₯μ• κ°€ λ°œμƒν–ˆλ‹€. 1번 μŒμ‹μ„ μ„­μ·¨ν•΄μ•Ό ν•  λ•Œ μ€‘λ‹¨λ˜μ—ˆμœΌλ―€λ‘œ, μž₯μ•  볡ꡬ 후에 1번 μŒμ‹λΆ€ν„° λ‹€μ‹œ λ¨ΉκΈ° μ‹œμž‘ν•˜λ©΄ λœλ‹€.
λ°˜μ‘ν˜•