λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/Programmers

[Programmers] κΈ°λŠ₯개발

 

 

문제 

 

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

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

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

 

 

μ œν•œ 사항

 

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

 

λ‚˜μ˜ μ½”λ“œ 
def solution(progresses, speeds):
    arr = []
    me = []
    # ν•™μŠ΅μ§„λ„ 100 κΈ°μ€€ μ–Όλ§ˆλ‚˜ λ‚¨μ•˜λŠ”μ§€ 차이λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 배열을 λ§Œλ“ λ‹€. 
    dif = [100 - i for i in progresses]
    cnt = 0
    cnt_arr =[]
    
    # speeds λ₯Ό κΈ°μ€€μœΌλ‘œ λ°°ν¬κΉŒμ§€ κ±Έλ¦¬λŠ” λ‚ μ§œλ₯Ό κ³„μ‚°ν•œλ‹€. 
    for i in range(len(dif)):
        if dif[i] % speeds[i] == 0:
            answer = dif[i] / speeds[i]
            arr.append(int(answer))
        else:
            answer = (dif[i] // speeds[i]) + 1
            arr.append(int(answer))
    print("arr",arr)
    
    # μ§μ „μ˜ μ›μ†Œλ³΄λ‹€ ν˜„μž¬μ˜ μ›μ†Œκ°€ 더 크닀면 ν˜„μž¬μ˜ μ›μ†Œλ₯Ό μ§μ „μ˜ μ›μ†Œμ™€ λ™μΌν•œ 수둜 λ°”κΏ”μ€€λ‹€. 
    while len(arr) >= len(me):
        for i in arr:
            me.append(i)
            if len(me) > 1:
                if me[-2] > me[-1]:
                    me.pop(-1)
                    me.append(me[-1])
            
    me = me[0:len(arr)]
    print(me)
    
    list1 = list(set(me))
    list1.sort(reverse=False)
    print(list1)
    
    # set ν•¨μˆ˜λ₯Ό ν™œμš©ν•΄ 각 μ›μ†Œμ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 배열을 λ§Œλ“€μ–΄μ€€λ‹€. 
    for i in list1:
        if i in me:
            cnt_arr.append(me.count(i))
    return cnt_arr

 

 

ν•΄μ„€ μ½”λ“œ 
import math

def solution(progresses, speeds):
    date_left = []
    answer = []
    
    # 진도 100%λ₯Ό λ‹¬μ„±ν•˜κΈ° μœ„ν•΄ κ±Έλ¦¬λŠ” λ‚ μ§œλ₯Ό 배열에 μΆ”κ°€ν•œλ‹€. 
    for i in range(len(progresses)):
        progress_left = 100 - progresses[i]
        date_left.append(math.ceil(progress_left/speeds[i]))
    
    # left보닀 큰 수λ₯Ό λ§Œλ‚˜κΈ° μ „κΉŒμ§€ μ§€λ‚˜κ°€λŠ” 수의 개수λ₯Ό 
    # result에 λ”ν•˜λ©΄μ„œ 첫번째 μ›μ†Œλ₯Ό pop ν•˜λŠ” 것을 λ°˜λ³΅ν•œλ‹€. 
    while date_left:
        left = date_left.pop(0)
        result = 1
        while len(date_left) != 0 and left >= date_left[0]:
            result += 1
            date_left.pop(0)
        answer.append(result)
    return answer
뢄석 > λ‚˜μ˜ μ½”λ“œμ™€ λ‹€λ₯Έ 점은 일단 μ§„λ„μœ¨μ„ μ±„μš°κΈ°κΉŒμ§€ κ±Έλ¦¬λŠ” μ‹œκ°„μ„, λ‚˜λˆ΄μ„ λ•Œ λ‚˜λ¨Έμ§€κ°€ 0인 κ²½μš°μ™€ 그렇지 μ•Šμ€ 경우λ₯Ό 일일이 κ΅¬ν•΄μ€¬μ§€λ§Œ 이 μ½”λ“œλŠ” math.ceil μ΄λΌλŠ” μ˜¬λ¦Όμ„ λ‚˜νƒ€λ‚΄λŠ” ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ κ°„νŽΈν•˜κ²Œ κ΅¬ν˜„ν–ˆλ‹€λŠ” 점이닀. 그리고 λ‚˜λŠ” 빈 μŠ€νƒμ— 쑰건에 λ§žλŠ” 수λ₯Ό μΆ”κ°€ν•΄μ£ΌλŠ” λ°©λ²•μœΌλ‘œ κ΅¬ν˜„ν•œ 반면, 이 μ½”λ“œλŠ” 0번째 μ½”λ“œλ₯Ό κΈ°μ€€μœΌλ‘œ κ·Έ μˆ˜λ³΄λ‹€ 큰 수λ₯Ό λ§Œλ‚˜κΈ° μ „κΉŒμ§€ κ±°μΉ˜λŠ” 수의 개수λ₯Ό κ΅¬ν•˜λ©΄μ„œ, λΉ„κ΅μ˜ 기쀀이 λ˜μ—ˆλ˜ 첫번째 μ›μ†Œλ₯Ό κ³„μ†ν•΄μ„œ popν•΄μ£ΌλŠ” 방법을 μ„ νƒν•˜μ˜€λ‹€. κ·Έλ ‡κ²Œ ν•˜λ‹ˆ, μ’€ 더 κ°„νŽΈν•˜κ²Œ 값을 ꡬ할 수 μžˆμ—ˆλ‹€.