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 |