🧠 κΈ°λŠ₯개발

문제

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ νŒ€μ—μ„œλŠ” κΈ°λŠ₯ κ°œμ„  μž‘μ—…μ„ μˆ˜ν–‰ 쀑이닀. 각 κΈ°λŠ₯은 진도가 100%일 λ•Œ μ„œλΉ„μŠ€μ— λ°˜μ˜ν•  수 μžˆλ‹€. 또, 각 κΈ°λŠ₯의 κ°œλ°œμ†λ„λŠ” λͺ¨λ‘ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 뒀에 μžˆλŠ” κΈ°λŠ₯이 μ•žμ— μžˆλŠ” κΈ°λŠ₯보닀 λ¨Όμ € 개발될 수 있고, μ΄λ•Œ 뒀에 μžˆλŠ” κΈ°λŠ₯은 μ•žμ— μžˆλŠ” κΈ°λŠ₯이 배포될 λ•Œ ν•¨κ»˜ λ°°ν¬λœλ‹€. λ¨Όμ € λ°°ν¬λ˜μ–΄μ•Ό ν•˜λŠ” μˆœμ„œλŒ€λ‘œ μž‘μ—…μ˜ 진도가 적힌 μ •μˆ˜ λ°°μ—΄ progresses와 각 μž‘μ—…μ˜ 개발 속도가 적힌 μ •μˆ˜ λ°°μ—΄ speedsκ°€ μ£Όμ–΄μ§ˆ λ•Œ 각 λ°°ν¬λ§ˆλ‹€ λͺ‡ 개의 κΈ°λŠ₯이 λ°°ν¬λ˜λŠ”μ§€λ₯Ό return ν•˜λ„λ‘ ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λΌ.

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

λ‚˜μ˜ 풀이

def dev_func(progresses, speeds):
    max_day = 0
    result = [1]
    for idx, progress in enumerate(progresses):
        work = 100 - progress
        day = math.ceil(work / speeds[idx])
        if not idx:
            max_day = day
        else:
            if day <= max_day:
                result[-1] += 1
            else:
                result.append(1)
                max_day = day
    return result

Level 2λΆ€ν„°λŠ” ν™•μ‹€νžˆ 문제λ₯Ό μ΄ν•΄ν•˜λŠ” 것뢀터 λ‚œκ΄€μ΄λ‹€..

μ°¨κ·Όμ°¨κ·Ό 이해λ₯Ό ν•΄λ³΄μžλ©΄, 예λ₯Ό λ“€μ–΄ [93, 30, 55], [1, 30, 5]κ°€ μž…λ ₯으둜 듀어왔을 경우 첫 번째 μž‘μ—…μ€ 93% μ™„λ£Œ λ˜μ—ˆμœΌλ―€λ‘œ 7%κ°€ λ‚¨μ•˜λ‹€. 이 μž‘μ—…μ˜ 개발 μ†λ„λŠ” 1%μ΄λ―€λ‘œ 이 μž‘μ—…μ„ μ™„λ£Œν•˜λŠ” λ°κΉŒμ§€ 7일이 κ±Έλ¦°λ‹€. 이 λ•Œ 7을 max_day에 λ„£μ–΄μ€€λ‹€. κ·Έ λ‹€μŒ μž‘μ—…μ„ ν•΄λ‹Ή μž‘μ—…κ³Ό ν•¨κ»˜ 배포할 μˆ˜λ„ 있기 λ•Œλ¬Έμ΄λ‹€. 첫 번째 μž‘μ—…λ¬Όμ€ μ–΄μ°Œλλ“  처음으둜 μž‘μ—…μ„ μ™„λ£Œν•˜λ―€λ‘œ result 리슀트의 첫 번째 인덱슀λ₯Ό 1둜 μ΄ˆκΈ°ν™”ν–ˆλ‹€.

두 번째 μž‘μ—…λ¬Όμ€ 30% μ™„λ£Œλ˜μ—ˆμœΌλ―€λ‘œ 70%κ°€ λ‚¨μ•˜κ³  일일 개발 μ†λ„λŠ” 30%이닀. μ™„λ£Œν•˜κΈ°κΉŒμ§€λŠ” 총 3일이 κ±Έλ¦°λ‹€. ν•˜μ§€λ§Œ κ·Έ μ „ μž‘μ—…μ„ μ™„λ£Œν•˜κΈ°κΉŒμ§€ 7일이 κ±Έλ¦¬λ―€λ‘œ 첫 번째 μž‘μ—…κ³Ό 두 번째 μž‘μ—…μ€ λ™μ‹œμ— λ°°ν¬λœλ‹€. κ·ΈλŸ¬λ―€λ‘œ result의 첫 번째 μΈλ±μŠ€μ— 1을 μ¦κ°€μ‹œν‚¨λ‹€.

μ„Έ 번째 μž‘μ—…λ¬Όμ€ 55%κ°€ μ™„λ£Œλœ μƒνƒœμ΄λ―€λ‘œ 45%κ°€ λ‚¨μ•˜κ³  μž‘μ—…μ†λ„κ°€ 5%μ΄λ―€λ‘œ 총 9일이 κ±Έλ¦°λ‹€. 9일은 7일보닀 ν¬λ―€λ‘œ μ΄μ „μ˜ μž‘μ—…λ“€κ³Ό ν•¨κ»˜ λ°°ν¬ν•˜μ§€ λͺ»ν•œλ‹€. κ·ΈλŸ¬λ―€λ‘œ result에 μƒˆλ‘œμš΄ 인덱슀λ₯Ό μΆ”κ°€ν•΄μ£Όμ–΄μ•Ό ν•˜λ©°, max_dayλŠ” 9둜 λ³€ν•˜κ²Œ λœλ‹€.

λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이

def dev_func(progresses, speeds):
    Q=[]
    for p, s in zip(progresses, speeds):
        if len(Q)==0 or Q[-1][0]<-((p-100)//s):
            Q.append([-((p-100)//s),1])
        else:
            Q[-1][1]+=1
    return [q[1] for q in Q]

λ‚˜λŠ” 두 리슀트의 λ™μΌν•œ 인덱슀λ₯Ό μ ‘κ·Όν•˜κΈ°μœ„ν•΄ enumerate()λ₯Ό μ‚¬μš©ν–ˆλŠ”λ°, 이 뢄은 zip()을 μ‚¬μš©ν•΄μ„œ κ°„νŽΈν•˜κ²Œ ν’€μ–΄λƒˆλ‹€. zip() ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό 같이 λ™μΌν•œ 개수둜 이루어진 μžλ£Œν˜•μ„ λ¬Άμ–΄μ€€λ‹€.

>>> list(zip([1, 2, 3], [4, 5, 6]))
[(1, 4), (2, 5), (3, 6)]
>>> list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]))
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
>>> list(zip("abc", "def"))
[('a', 'd'), ('b', 'e'), ('c', 'f')]

μ΄μ™Έμ˜ μ½”λ“œλ“€μ€ λΉ„μŠ·ν•œ λ°©λ²•μ΄μ§€λ§Œ 훨씬 κ°„κ²°ν•˜κ²Œ ν’€μ–΄λ‚΄μ…¨λ‹€ γ… γ… 

이런 μ½”λ“œλ₯Ό λ³Ό λ•Œλ§ˆλ‹€ κ°νƒ„ν•˜λ©΄μ„œλ„ 쒋은 자극이 λœλ‹€.

References


Written by@ugaemi
Record things I want to remember

🐱 GitHubπŸ“š Reading Space