본문 바로가기
프로그래밍/알고리즘 문제

[프로그래머스] 스택/큐 기능개발 (python)

by 잇서니 2019. 8. 25.
반응형

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 조건은 판별하지 않기 때문입니다.
반응형

댓글