codes/programmers

42586 기능개발

카제xd 2024. 12. 14. 00:38

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

 

 

# 처음 짠 코드 -> 첫 값에 대한 이슈를 for문 안에서 처리하여 매번 검토하는 비효율

import math

def solution(progresses, speeds):

    result = []
    days = []
    maxd = 0
    
    for x, y in zip(progresses, speeds):
        day = math.ceil((100-x)/y)
        
        if not days: # 사실상 맨 처음에만 유효
            maxd = day
        elif day > maxd:
            result.append(len(days))
            maxd = day
            days = []
        days.append(day)
        
    if days:
        result.append(len(days))
    
    return result

 

 

# 다른 사람들 코드 -> 작업을 그룹화. 시작 및 기존보다 더 큰 값이 나올때마다 그룹을 시작하고 카운트 증가

def solution(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]

 

 

# 개선된 내 코드 -> 초기값을 for문 밖에서 initalization을 하고 idx 1부터 순회하기

def solution(progresses, speeds):

    result = []
    days = 1
    maxd = -((progresses[0]-100)//speeds[0])
    
    for i in range(1, len(progresses)):
        cur = -((progresses[i]-100)//speeds[i])
        
        if cur > maxd:
            result.append(days)
            maxd = cur
            days = 1
        else:
            days += 1
    
    result.append(days)
    
    return result

 

 

 

[개선할 점]

- math.ceil 없이 올림을 하는 방법: 나누려는 수를 음수로 만들고 // 연산을 하면 됨.

- 리스트의 len을 구하는 방식보다 그냥 cnt를 늘리는 것이 더 효율적.

- 시작 처리가 애매했음. 더 큰 값이 나오면 이전까지의 카운트를 구하는 방식보다는 첫값을 기준으로 해서 후행하는 작은 것들의 카운트를 늘리는 방식이 좋다.

 

'codes > programmers' 카테고리의 다른 글

42584 주식가격  (1) 2024.12.27
42587 프로세스  (0) 2024.12.24
86491 최소직사각형  (1) 2024.12.13
12906 같은 숫자는 싫어  (0) 2024.12.12
42576 완주하지 못한 선수  (0) 2024.12.10