728x90
📌 풀이 1
우선 remail_days라는 리스트를 만들어 준다.
이 리스트에는 progresses 에서 speeds를 나누어 준 값을 올림 한 값 즉 남은 작업일 수를 저장해준다.
이때 for 문을 이용하여도 되지만 간단히 쓰기 위해 labda 함수를 이용한다. 또한 올림 처리는 math 라이브러리의 ceil 함수를 이용했다.
ramain_days = []
for i, j in zip(progresses, speeds):
remain_days.append(math.ceil((100 - i) / j))
-> 람다식으로 전환
remain_days = list(map(lambda x: (math.ceil((100 - progresses[x]) / speeds[x])), range(len(progresses))))
비교대상의 기준이 될 인덱스 temp를 0, result를 1로 잡고 시작한다.
만약 그 기준이 비교대상 보다 크다면 result를 1씩 올리고 continue 처리, 크지 않다면 기준이 되는 temp를 비교대상 인덱스로 바꾸어 주고 결과 리스트에 result를 append 해 준 뒤 result를 다시 1로 바꾸어준다.
만약 remain_days = [7, 3, 9] (첫 번째 예시) 라면 temp는 0에서 시작했다가 remain_days [temp] < remain_days [i]가 되는 순간 해당 인덱스인 i로 바뀌고 result는 다시 1이 된다.
마지막 원소까지 비교해야 하므로 시작할 때 문제의 progress의 최대값인 100보다 1이 큰 101을 append 해주고 시작한다.
코드
import math
def solution(progresses, speeds):
remain_days = list(map(lambda x: (math.ceil((100 - progresses[x]) / speeds[x])), range(len(progresses))))
temp = 0
result = 1
results = []
remain_day.append(101)
for i in range(len(remain_day) - 1):
a = remain_day[temp]
if a >= remain_day[i + 1]:
result += 1
continue
else:
results.append(result)
temp = i + 1
result = 1
return(results)
📌 풀이 2
원리는 풀이 1과 동일하지만 훨씬 깔끔한 코드가 있어 첨부한다.
이 코드의 핵심이자 중요 포인트는 index에러가 발생할 때 즉 위 코드의 101을 넣어준 부분을 처리하는 로직에 현재 result 값을 remain_days (여기서는 daysLeft)에 넣어준 것이다.
코드
from math import ceil
def solution(progresses, speeds):
daysLeft = list(map(lambda x: (ceil((100 - progresses[x]) / speeds[x])), range(len(progresses))))
count = 1
retList = []
for i in range(len(daysLeft)):
try:
if daysLeft[i] < daysLeft[i + 1]:
retList.append(count)
count = 1
else:
daysLeft[i + 1] = daysLeft[i]
count += 1
except IndexError:
retList.append(count)
return retList
'Algorithm' 카테고리의 다른 글
[파이썬] 프로그래머스 - 다리를 지나는 트럭 (0) | 2022.05.04 |
---|---|
[파이썬] 프로그래머스 - 프린터 (0) | 2022.04.17 |
[파이썬] 프로그래머스 - 위장 (0) | 2022.04.07 |
[파이썬] 프로그래머스 - 전화번호 목록 (0) | 2022.04.02 |
리트코드(LeetCode) 344번 문자열 뒤집기 (0) | 2022.03.28 |