[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/python] μŠ€νƒ/큐 : κΈ°λŠ₯개발

2021. 6. 29. 17:07

문제 μ„€λͺ…

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

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

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

 

μ œν•œ 사항

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

 

μ •λ‹΅

def solution(progresses, speeds):
    answer = []

    while progresses:
        for i in range(len(progresses)):
            progresses[i] += speeds[i]

        finish = 0
        while progresses and progresses[0] >= 100:
            del progresses[0]
            del speeds[0]
            finish += 1
        if finish > 0:
            answer.append(finish)

    return answer

ν†΅κ³Όν•˜μ˜€μ§€λ§Œ while문을 두 번 μ‚¬μš©ν•˜λ―€λ‘œ 효율적인 μ½”λ“œλŠ” μ•„λ‹ˆλ‹€.

μŠ€νƒμ΄λ‚˜ 큐λ₯Ό μ‚¬μš©ν•˜μ§€λ„ μ•Šμ•˜λ‹€.

 

λ‹€λ₯Έ μ •λ‹΅

def solution(progresses, speeds):
    Q = []
    for p, s in zip(progresses, speeds):
        days = -((p-100)//s)    # μ˜¬λ¦Όν•˜κΈ° μœ„ν•΄ p-100 ν›„ -
        if not Q or days > Q[-1][0] :
            Q.append([days,1])
        else:
            Q[-1][1] += 1
            
    return [q[1] for q in Q]

λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이λ₯Ό μ΄ν•΄ν•˜κΈ° 쉽도둝 살짝 μˆ˜μ •ν•œ μ½”λ“œμ΄λ‹€.

 

zip을 μ΄μš©ν•˜μ—¬ 두 리슀트의 같은 μœ„μΉ˜μ˜ 수λ₯Ό p, s둜 ν• λ‹Ήν•˜κ³ 

days에 λͺ‡μΌλ™μ•ˆ μž‘μ—…ν•΄μ•Όν•˜λŠ”μ§€ κ³„μ‚°ν•œλ‹€.

100-pκ°€ μ•„λ‹Œ p-100 ν›„ s둜 λ‚˜λˆ„λŠ” μ΄μœ λŠ” μ˜¬λ¦Όν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€.

예λ₯Ό λ“€μ–΄ pκ°€ 40이고 sκ°€ 40인 κ²½μš°μ—μ„œ (100-40)/40 = 1.5μ΄λ―€λ‘œ 2일이 κ±Έλ¦°λ‹€.

(100-p)//s둜 κ³„μ‚°ν•˜λ©΄ (100-40)//40 = 1 이 되고

(p-100)//s둜 κ³„μ‚°ν•˜λ©΄ (40-100)//40 = -2 κ°€ λ˜λ―€λ‘œ μžλ™μœΌλ‘œ 올림이 κ°€λŠ₯ν•˜λ‹€.

 

Q의 μ›μ†ŒλŠ” [days, 배포 κ°€λŠ₯ μž‘μ—…μ˜ 수]의 리슀트둜 μ΄λ£¨μ–΄μ Έμžˆλ‹€.

Qκ°€ λΉ„μ–΄μžˆκ±°λ‚˜ Q[-1][0]이 days보닀 μž‘λ‹€λ©΄ 

μ•žμ˜ μž‘μ—…μ΄ μ™„λ£Œλ˜μ—ˆμ„ λ•Œ μžμ‹ μ€ μ™„λ£Œλ˜κΈ° μ „μ΄λΌλŠ” λœ»μ΄λ―€λ‘œ Q에 [days, 1]을 μΆ”κ°€ν•œλ‹€.

Q[-1][0]이 days보닀 크닀면

μ•žμ˜ μž‘μ—…μ΄ μ™„λ£Œλ˜μ—ˆμ„ λ•Œ μžμ‹ λ„ μ™„λ£Œλ˜μ–΄μžˆλ‹€λŠ” λœ»μ΄λ―€λ‘œ Q[-1][1]에 1을 μΆ”κ°€ν•œλ‹€.

 

728x90

BELATED ARTICLES

more