Algorithm/PROGRAMMERS

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ "κΈ°λŠ₯개발" [μ•Œκ³ λ¦¬μ¦˜/μŠ€νƒ/ 큐/ μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅/ 파이썬(python)]

DAHLIA CHOI 2021. 7. 4. 16:30

https://programmers.co.kr/learn/courses/30/parts/12081

 

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

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

 

 

[문제]

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ νŒ€μ—μ„œλŠ” κΈ°λŠ₯ κ°œμ„  μž‘μ—…μ„ μˆ˜ν–‰ μ€‘μž…λ‹ˆλ‹€. 각 κΈ°λŠ₯은 진도가 100%일 λ•Œ μ„œλΉ„μŠ€μ— λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

또, 각 κΈ°λŠ₯의 κ°œλ°œμ†λ„λŠ” λͺ¨λ‘ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 뒀에 μžˆλŠ” κΈ°λŠ₯이 μ•žμ— μžˆλŠ” κΈ°λŠ₯보닀 λ¨Όμ € 개발될 수 있고, μ΄λ•Œ 뒀에 μžˆλŠ” κΈ°λŠ₯은 μ•žμ— μžˆλŠ” κΈ°λŠ₯이 배포될 λ•Œ ν•¨κ»˜ λ°°ν¬λ©λ‹ˆλ‹€.

λ¨Όμ € λ°°ν¬λ˜μ–΄μ•Ό ν•˜λŠ” μˆœμ„œλŒ€λ‘œ μž‘μ—…μ˜ 진도가 적힌 μ •μˆ˜ λ°°μ—΄ progresses와 각 μž‘μ—…μ˜ 개발 속도가 적힌 μ •μˆ˜ λ°°μ—΄ speedsκ°€ μ£Όμ–΄μ§ˆ λ•Œ 각 λ°°ν¬λ§ˆλ‹€ λͺ‡ 개의 κΈ°λŠ₯이 λ°°ν¬λ˜λŠ”μ§€λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜μ„Έμš”.

 

[μ œν•œμ‚¬ν•­]

  • μž‘μ—…μ˜ 개수(progresses, speedsλ°°μ—΄μ˜ 길이)λŠ” 100개 μ΄ν•˜μž…λ‹ˆλ‹€.
  • μž‘μ—… μ§„λ„λŠ” 100 미만의 μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • μž‘μ—… μ†λ„λŠ” 100 μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • λ°°ν¬λŠ” ν•˜λ£¨μ— ν•œ 번만 ν•  수 있으며, ν•˜λ£¨μ˜ 끝에 이루어진닀고 κ°€μ •ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μ§„λ„μœ¨μ΄ 95%인 μž‘μ—…μ˜ 개발 속도가 ν•˜λ£¨μ— 4%라면 λ°°ν¬λŠ” 2일 뒀에 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

 

[예제 μ„€λͺ…1번]

첫 번째 κΈ°λŠ₯은 93% μ™„λ£Œλ˜μ–΄ 있고 ν•˜λ£¨μ— 1%μ”© μž‘μ—…μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ 7일간 μž‘μ—… ν›„ 배포가 κ°€λŠ₯ν•©λ‹ˆλ‹€.
두 번째 κΈ°λŠ₯은 30%κ°€ μ™„λ£Œλ˜μ–΄ 있고 ν•˜λ£¨μ— 30%μ”© μž‘μ—…μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ 3일간 μž‘μ—… ν›„ 배포가 κ°€λŠ₯ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 이전 첫 번째 κΈ°λŠ₯이 아직 μ™„μ„±λœ μƒνƒœκ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— 첫 번째 κΈ°λŠ₯이 λ°°ν¬λ˜λŠ” 7일째 λ°°ν¬λ©λ‹ˆλ‹€.
μ„Έ 번째 κΈ°λŠ₯은 55%κ°€ μ™„λ£Œλ˜μ–΄ 있고 ν•˜λ£¨μ— 5%μ”© μž‘μ—…μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ 9일간 μž‘μ—… ν›„ 배포가 κ°€λŠ₯ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ 7일째에 2개의 κΈ°λŠ₯, 9일째에 1개의 κΈ°λŠ₯이 λ°°ν¬λ©λ‹ˆλ‹€.

 


μŠ€νƒμ΄λž‘ 큐λ₯Ό μ‚¬μš©ν•˜λŠ” λ¬Έμ œμ—¬μ„œ κ·Έλƒ₯ appendλž‘ popλ§Œμ„ μ΄μš©ν•΄μ„œ ν’€λ©΄ μ•ˆλ˜λŠ” 쀄 μ•Œκ³  ꡉμž₯히...λ³΅μž‘ν•˜κ²Œ ν’€μ—ˆλ‹€γ… γ… 

dequeλž‘ queue λ‚΄μž₯ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κΈ΄ ν–ˆμ§€λ§Œ, 전체적인 μˆ˜ν–‰μ‹œκ°„μ΄ O(n^2)인 것 κ°™μ•„μ„œ 아쉽닀.

더 μ—΄μ‹¬νžˆ κ³΅λΆ€ν•΄μ„œ μˆ˜ν–‰μ‹œκ°„ 쀄이고, κ°„κ²°ν•œ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μž‘μ„±ν•΄λ³΄λ„λ‘ λ…Έλ ₯ν•΄μ•Όκ² λ‹€!

 

from collections import deque
import queue

def solution(progresses, speeds):
    answer = []
    Q = queue.Queue()
    
    for i in range(len(speeds)):
        count = 0
        dq = deque()
        dq.append(speeds[i])
        dq.append(progresses[i])

        while(dq[-1] < 100):
            temp = dq.popleft()
            dq.append(temp)
            dq.append(dq.popleft() + temp)
            count += 1
        Q.put(count)
        
    max = Q.get()
    num = 1
    print(Q.qsize())
    for i in range(Q.qsize()):
        tmp = Q.get()
        if max >= tmp:
            num += 1
        else:
            max = tmp
            answer.append(num)
            num = 1
        if Q.qsize() == 0: answer.append(num)

    return answer