문제 설명

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.

제한 사항

prices의 각 가격은 1 이상 10,000 이하인 자연수입니다. prices의 길이는 2 이상 100,000 이하입니다.

입출력 예

prices return
[1, 2, 3, 2, 3] [4, 3, 1, 1, 0]

입출력 예 설명

  • 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
  • 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
  • 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
  • 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
  • 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.

문제 풀이

나는 처음 문제의 접근을 시점기준으로 해보았다.

시점의 이동을 기준으로 그 시점앞 가격들을 비교하여 answer+=1해주는 식으로 접근해 보았지만 효율성 문제로 통과되지 않았다.

def solution(prices):
    answer = [0]*len(prices)                                       
    test = [True]*len(prices)
    for i in range(1,len(prices)):          
        for j in range(i):    
			if test[j]==False:
				continue
			
			answer[j]+=1
            
			if prices[j]>prices[i]:
				test[j]=False
    return answer

그 시점에서 앞에 이미 주식이 감소하여 검사할 필요가 없는 것을 추가해주기 위해 test리스트에 true, false로 검사 필요의 유무를 확인했다.

하지만 효율성에서 떨어져 시점기준이 아니라 가격기준으로 다시 접근해 보았다.

한시점의 가격을 for문 돌려 가격이 떨어지는 시점이 나오면 break를 아니면 끝까지 +=1이 되도록 설정하였더니 효율성에서도 통과되었다.

def solution(prices):
    answer = [0]*len(prices)                                   
    for i in range(len(prices)-1):          
        for j in range(i+1,len(prices)):   
            answer[i]+=1                    
            if prices[j]<prices[i] :       
                break
    
    return answer

문제는 두번의 if문

효율성의 탈락은 시점기준이냐 가격기준이냐의 문제보다는 for문안에 두번의 조건문 때문인 것 같다.

굳이 test리스트를 생성하지 않고 하나의 조건문만을 사용한다면 효율성 통과.

참고 : https://programmers.co.kr/learn/courses/30/lessons/42584