https://school.programmers.co.kr/learn/courses/30/lessons/42586

 

문제

 

문제 μ„€λͺ…

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

 

μ œν•œ 사항

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

 

μž…μΆœλ ₯ 예

progresses speeds return
[93, 30, 55] [1, 30, 5] [2, 1]
[95, 90, 99, 99, 80, 99] [1, 1, 1, 1, 1] [1, 3, 2]

 

 

μ†ŒμŠ€ μ½”λ“œ
# 1
import math

def solution(progresses, speeds):
    n = len(progresses)
    answers = []

    # 각 μž‘μ—…μ΄ 100% 되기 μœ„ν•΄ κ±Έλ¦¬λŠ” μ‹œκ°„
    times = [math.ceil((100-progresses[i])/speeds[i]) for i in range(n)]

    cnt = 1                 # μ™„λ£Œλœ μž‘μ—…μ˜ 수
    max_time = times[0]     # 첫 번째 μž‘μ—…μ˜ μ‹œκ°„μ„ max_time으둜 지정

    # μ‹œκ°„ 리슀트λ₯Ό λŒλ©΄μ„œ max_timeκ³Ό 비ꡐ
    for i in range(1,n):
        if times[i] <= max_time:    # 1. ν•„μš”ν•œ μ‹œκ°„μ΄ max_time보닀 적으면
            cnt += 1                #    μž‘μ—…μ΄ μ™„λ£Œλœ κ²ƒμ΄λ―€λ‘œ μž‘μ—…μ˜ 수 +1
        else:                       # 2. ν•„μš”ν•œ μ‹œκ°„μ΄ max_time보닀 많으면
            answers.append(cnt)     #    ν˜„μž¬κΉŒμ§€ μ™„λ£Œν•œ μž‘μ—…μ˜ 수λ₯Ό answers에 μΆ”κ°€
            max_time = times[i]     #    max_time을 ν˜„μž¬ μž‘μ—…μ˜ λ‚¨μ€μ‹œκ°„μœΌλ‘œ λ³€κ²½
            cnt = 1                 #    μž‘μ—…μ˜ 수 μ΄ˆκΈ°ν™”
    
    answers.append(cnt)             # 3. λ§ˆμ§€λ§‰ μž‘μ—…μ΄ μΆ”κ°€λ˜μ§€ μ•Šκ³  forλ¬Έ μ’…λ£Œλ˜μ—ˆμœΌλ―€λ‘œ λ§ˆμ§€λ§‰ μž‘μ—… 수 μΆ”κ°€
        
    return answers

 

풀이 #1

  • 주어진 μž‘μ—…μ˜ 수λ₯Ό n으둜 μ •μ˜
  • μ•„λž˜μ˜ 곡식을 μ°Έκ³ ν•˜μ—¬ 각 μž‘μ—…μ΄ μ™„λ£Œλ˜λ €λ©΄ κ±Έλ¦¬λŠ” μ‹œκ°„μ„ times 리슀트둜 생성
    • progresses(ν˜„μž¬ μ™„λ£Œλœ μž‘μ—…μ˜ 정도) + (speeds(μž‘μ—…μ˜ 속도) * times(μž‘μ—… μ‹œκ°„) = 100%
  • cnt : μ™„λ£Œλœ μž‘μ—…μ˜ 수 / max_time : μ•žλΆ€λΆ„ μž‘μ—…μ΄ μ™„λ£Œλ˜λ €λ©΄ κ±Έλ¦¬λŠ” μ‹œκ°„
  • ν˜„μž¬ μž‘μ—…μ˜ 남은 μ‹œκ°„(times[i])κ³Ό 기쀀이 λ˜λŠ” μ‹œκ°„(max_time)을 비ꡐ
    • times[i] κ°€ max_time보닀 적닀면 ν˜„μž¬μ˜ μž‘μ—…μ΄ μ™„λ£Œλœ κ²ƒμ΄λ―€λ‘œ cnt + 1
    • times[i]κ°€ max_time보닀 λ§Žλ‹€λ©΄ μž‘μ—…μ΄ μ™„λ£Œλ˜κΈ°κΉŒμ§€ μ‹œκ°„μ΄ 더 ν•„μš”ν•œ 것
      • ν˜„μž¬κΉŒμ§€ μ™„λ£Œλœ μž‘μ—…μ˜ 수λ₯Ό answers에 μΆ”κ°€
      • 기쀀이 λ˜λŠ” μ‹œκ°„(max_time)을 ν˜„μž¬ μ‹œκ°„μœΌλ‘œ λ°”κΎΈκ³  cnt도 μ΄ˆκΈ°ν™”

 

# 2
def solution(progresses, speeds):
    answers = []
    time = 0    # μž‘μ—…μ΄ ν•„μš”ν•œ μ‹œκ°„
    cnt = 0     # μ™„λ£Œλœ μž‘μ—…μ˜ 수

    while len(progresses) > 0:
    	# 1. 진행 상황이 100 이상이 된 경우
        if(progresses[0] + time * speeds[0]) >= 100:
            progresses.pop(0)   # μž‘μ—…μ΄ μ™„λ£Œλœ κ²ƒμ΄λ―€λ‘œ progressesμ—μ„œ ν•΄λ‹Ή μž‘μ—… 제거
            speeds.pop(0)       # μž‘μ—…κ³Ό μ†λ„μ˜ 인덱슀λ₯Ό λ§žμΆ”μ–΄μ•Ό ν•˜λ―€λ‘œ speedsμ—μ„œλ„ 제거
            cnt += 1            # μž‘μ—…μ˜ 수 + 1
        # 2. 진행 상황이 100 미만인 경우
        else:
            if cnt > 0:                 # μ™„λ£Œλœ μž‘μ—…μ΄ μžˆλ‹€λ©΄
                answers.append(cnt)     # ν˜„μž¬κΉŒμ§€ μ™„λ£Œν•œ μž‘μ—…μ„ answers에 μΆ”κ°€
                cnt = 0                 # μž‘μ—…μ˜ 수 μ΄ˆκΈ°ν™”
            else:                       # μ™„λ£Œλœ μž‘μ—…μ΄ μ—†λ‹€λ©΄
                time += 1               # ν•„μš”ν•œ μ‹œκ°„μ„ μΆ”κ°€
    
    # 3. λ§ˆμ§€λ§‰ μž‘μ—…μ΄ μΆ”κ°€λ˜μ§€ μ•Šκ³  whileλ¬Έ μ’…λ£Œλ˜μ—ˆμœΌλ―€λ‘œ λ§ˆμ§€λ§‰ μž‘μ—… 수 μΆ”κ°€
    answers.append(cnt)

    return answers

 

풀이 #2

  • μž‘μ—…μ΄ ν•„μš”ν•œ μ‹œκ°„κ³Ό μ™„λ£Œλœ μž‘μ—…μ˜ 수λ₯Ό 각각 time, cnt둜 μ •μ˜
  • 진행 쀑인 μž‘μ—…μ΄ μžˆλŠ” 리슀트(progresses)의 길이가 0보닀 크면 μ•„λž˜μ˜ λ‚΄μš©μ„ λ°˜λ³΅ν•΄μ„œ 진행
    • μ•„λž˜μ˜ 곡식이 100이상이면 μž‘μ—…μ΄ μ™„λ£Œλœ κ²ƒμ΄λ―€λ‘œ progresses와 speedμ—μ„œ ν•΄λ‹Ή μž‘μ—… 제거
      • progresses(ν˜„μž¬ μ™„λ£Œλœ μž‘μ—…μ˜ 정도) + (speeds(μž‘μ—…μ˜ 속도) * times(μž‘μ—… μ‹œκ°„) = 100%
      • μ™„λ£Œλœ μž‘μ—…μ˜ 수 cnt + 1
    • cntκ°€ 0보닀 크닀면 μ™„λ£Œλœ μž‘μ—…μ΄ μžˆλŠ” κ²ƒμ΄λ―€λ‘œ answers에 μ™„λ£Œλœ μž‘μ—…μ˜ 수 μΆ”κ°€ν•˜κ³  μ΄ˆκΈ°ν™”
    • μ™„λ£Œλœ μž‘μ—…μ΄ μ—†λ‹€λ©΄ μ‹œκ°„μ΄ 더 ν•„μš”ν•œ κ²ƒμ΄λ―€λ‘œ μ‹œκ°„μ„ μΆ”κ°€

 

μ‰½κ²Œ 풀릴 것 κ°™μ•˜λŠ”λ° μ€κ·Όνžˆ ν’€κΈ° μ–΄λ €μš΄ λ¬Έμ œμ˜€λ‹€.....κ±Έλ¦¬λŠ” μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ 두고 λΉ„κ΅ν•˜λŠ” 방법과 진행상황을 νŒλ‹¨ν•΄μ„œ λΉ„κ΅ν•˜λŠ” 2가지 방법이 μžˆμ–΄μ„œ νŽΈν•œ λ°©λ²•μœΌλ‘œ μ‚¬μš©ν•˜λ©΄ 쒋을 것 κ°™λ‹€.
 

+ Recent posts