프로그래머스 스택/큐 - 주식가격

이환희·2021년 4월 29일
0

Algorithm

목록 보기
15/47

문제 설명

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

제한사항

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

입출력 예
prices
[1, 2, 3, 2, 3]
return
[4, 3, 1, 1, 0]

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

풀이(효율성 테스트 시간초과 남)

def solution(prices):
    answer = []
    answer.append(0)
    check = [0 for _ in range(len(prices))]
    for i in range(1, len(prices)):
        answer.append(0)
        for j in range(len(answer)-1):
            if prices[i] >= prices[j] and check[j] == 0:
                answer[j] += 1
            elif check[j] == 0:
                check[j] = 1
                answer[j] += 1
    return answer
  • i는 초이고
  • 현재 가격이 이전(j) 대비 오르거나 같으면 초를 추가하고
  • 가격이 내려갔으면 check해서 고정해버림
    -> 테스트케이스는 전부 통과하나 효율성 테스트에서 시간초과 떠버림 ㅠㅠ

다른 사람 풀이

def solution(prices):
    answer =[0] * len(prices)
    for i in range(len(prices)):
        for j in range(i+1, len(prices)):
            if prices[i] <= prices[j]:
                answer[i]+=1
            else:
                answer[i]+=1
                break
    return answer
  • 이렇게 간단할 수 가..
  • 현재를 i로 잡고 j로 i다음 꺼부터 순차적으로 돌아서 자기보다 작은게 나올때 까지돌린다.

스택으로 풀기

  • 이 문제는 스택으로 풀었을 때 훨씬 더 효율적이다.
def solution(prices):
    answer = [0]*len(prices)
    stack = []
 
    for i, price in enumerate(prices):
        #stack이 비었이면 false
        # 스택 마지막 값이 현재 가격보다 크면 -> 가격이 떨어졌다는 의미 -> pop
        while stack and price < prices[stack[-1]]:
            j = stack.pop()
            answer[j] = i - j
        stack.append(i)
 
    # for문 다 돌고 Stack에 남아있는 값들 pop
    while stack:
        j = stack.pop()
        answer[j] = len(prices) - 1 - j
 
    return answer
  • for문을 돌린다. i는 현재 초
  • 스택에 값이 있고 스택의 마지막 값이 현재 가격보다 크면 가격이 떨어졌다는 의미이다
  • 스택에서 pop을 한다는것은 시간을 고정 시키겠다는 의미
  • 스택에 쌓기 전에 스택의 마지막 값과 현재 가격을 비교한 후 가격이 떨어졌으면 스택에서 마지막껄 뺀다음 j에 넣어주고 현재시간(i) - j 를 answer[j]에 넣어주므로써 고정시킨다.

prices [1,2,3,2,3]
answer [0,0,0,0,0]

  • 정리하면 스택에 현재 시간을 계속 쌓는다
    [0,1,2]
  • 3초에서 가격이 내려갔으므로
    [0,1] >>pop>> 2 , answer[2] = 3 - 2 => answer[0,0,1,0,0]
  • [0,1,3,4] 그 뒤로 내려간적이 없어서 그대로 스택에 쌓인다
  • 스택에 쌓인 숫자들은 시간초들이다
  • 여기서는 answer[j]와 같이 j가 인덱스이면서 j+1초대 유지시간이라 할 수 있다.
  • 따라서 모두 j로 꺼내어서 answer[j] = (총시간-1) - j를 해준다.

0개의 댓글

관련 채용 정보