반응형
1차시도
import math
def solution(progresses, speeds):
answer = []
progresses_left=[]
time_left=[]
cnt=1
for i in progresses:
progresses_left.append(100-i)
for i,j in zip(progresses_left,speeds):
time_left.append(math.ceil(i/j))
while time_left:
tmp=time_left.pop(0)
if len(time_left)==0:
answer.append(cnt)
break
elif tmp >= time_left[0]:
time_left.pop(0)
cnt += 1
else :
break
answer.append(cnt)
cnt=1
return answer
틀린 이유
- tmp>=time_left[0] 의 비교를 1번만 했기 때문입니다. tmp보다 작거나 같은 녀석들이 많을 경우에는 time_left.pop(0), cnt+=1의 과정을 계속 반복해야 되는데 말입니다. 그래야 각 배포마다 몇 개의 기능이 배포되는지 모두 count를 할 수 있기 때문입니다.
2차시도 성공!
import math
def solution(progresses, speeds):
answer = []
progresses_left=[]
time_left=[]
cnt=1
for i in progresses:
progresses_left.append(100-i)
for i,j in zip(progresses_left,speeds):
time_left.append(math.ceil(i/j))
while time_left:
tmp=time_left.pop(0)
if len(time_left)==0:
answer.append(cnt)
break
else:
while time_left and tmp >= time_left[0] :
time_left.pop(0)
cnt += 1
answer.append(cnt)
cnt=1
return answer
아이디어
- 1차 시도와 동일한 아이디어입니다. 단, 틀린 이유를 보완한 코드입니다.
- progress_left 리스트에 남은 진도율을 저장합니다.
- time_left에는 남은 진도율을 완수하기 위해서 얼만큼의 시간이 필요한지 계산하여 저장합니다.
- progress_left를 speeds로 나누면 됩니다. 단, 올림함수를 적용해야 합니다. 하루에 1번만 배포를 진행하기 때문입니다. 2.2일이 필요하다고 하면 어차피 2일에는 배포가 안 될 것이기 때문에 3일에 배포해야 되는 상황입니다.
파이썬 개념
zip 함수
arr1=[1,2]
arr2=[3,4]
for i,j in arr1,arr2:
print(i,j)
# 1, 2
# 3, 4
arr1=[1,2]
arr2=[3,4]
for i,j in zip(arr1,arr2):
print(i,j)
# 1, 3
# 2, 4
and 조건
test=[]
a=3
while a>1 and test[0]>1:
print("hihi")
#오류 발생
#IndexError: list index out of range
#test[0]>1 조건을 판별하려는데 test[0]은 없기 때문입니다.
test=[]
a=3
while a>4 and test[0]>1:
print("hihi")
#정상수행
#단, while문은 안 들어갑니다.
#and는 둘 다 True여야 하는데, 이미 a>4가 False이므로 test[0]>1 조건은 판별하지 않기 때문입니다.
반응형
'프로그래밍 > 알고리즘 문제' 카테고리의 다른 글
[프로그래머스] 해시 - 완주하지 못한 선수 (python) (2) | 2019.08.27 |
---|---|
[프로그래머스] 스택/큐 주식가격 (python) (4) | 2019.08.26 |
[프로그래머스] 스택/큐 다리를 지나가는 트럭 (python) (2) | 2019.08.22 |
[프로그래머스] 스택/큐 쇠막대기 (python) (8) | 2019.08.19 |
[프로그래머스] 스택/큐 탑 문제 (python) (132) | 2019.08.18 |
댓글