프로그래머스 - 주식가격

박상진·2022년 3월 3일

개인 공부

목록 보기
4/4
post-thumbnail

주식가격의 다른사람이 푼 풀이를 보면서 큰 공부가 되어서 적는다.
문제 링크

코드

def solution(prices):
    stack = []
    answer = [0] * len(prices)
    for i in range(len(prices)):
        if stack != []:
            while stack != [] and stack[-1][1] > prices[i]:
                past, _ = stack.pop()
                answer[past] = i - past
                print(answer)
        stack.append([i, prices[i]])
        print(stack)
    for i, s in stack:
        answer[i] = len(prices) - 1 - i
    return answer
  • 중간에 print()가 있는 것 덕분에 이해할 수 있어서 그대로 두었다.
  • 추천 테스트 케이스는 입력값[5, 8, 6, 2, 4, 1]과 기댓값[3, 1, 1, 2, 1, 0]이다.

해석

일단 print()된 결과를 보자.

[[0, 5]]
[[0, 5], [1, 8]]
[0, 1, 0, 0, 0, 0]

[[0, 5], [2, 6]]
[0, 1, 1, 0, 0, 0]

[3, 1, 1, 0, 0, 0]

[[3, 2]]
[[3, 2], [4, 4]]
[3, 1, 1, 0, 1, 0]
[3, 1, 1, 2, 1, 0]
[[5, 1]]

위의 결과는 추천 테스트 케이스의 입력 결과이다.

  1. 첫번째 for문이 돌아갈 때 if를 만족하지 않기 때문에 바로 append로 넘어간다.
    • 이때 [0, 5]가 입력된다.
    • 두번째에선 if를 만족하지만 while을 만족하지 않기 때문에 지나간다.
  2. 세번째 순서에서 stack[-1][1] = 8,prices[i] = 6이기 때문에 while문 내부로 진입한다.
    • while내부에서는 i번째 인덱스와 이전 숫자의 인덱스를 빼준다.
    • 이 시간이 곧 가격이 떨어진 시점이다.
  3. [0, 1, 1, 0, 0, 0]일 때까지 진행한 후에 곧바로 [3, 1, 1, 0, 0, 0]으로 바뀌게된다.
    • 이 부분 때문에 이 글을 쓰게되었다

    • while문은 조건이 만족되는 한 계속해서 돌아가게 되어있다.
    • 3번째 요소값인 20번째 요소값인 5를 비교하게 되는 것이다.
    • 사람이 이런 생각하는게 너무 신기하다;
  4. 계속 반복하면 문제가 풀린다.
  5. 문제에 기본적으로 제시된 입출력([1, 2, 3, 2, 3],[4, 3, 1, 1, 0])의 print()결과는 이와같다.
[[0, 1]]
[[0, 1], [1, 2]]
[[0, 1], [1, 2], [2, 3]]
[0, 0, 1, 0, 0]
[[0, 1], [1, 2], [3, 2]]
[[0, 1], [1, 2], [3, 2], [4, 3]]
  1. 중간에 자신보다 작아지는 숫자가 없으면 아래 for문으로 내려간다.
    • 자신보다 작아지는 숫자가 없다는 뜻임으로 끝까지의 인덱스를 자신의 인덱스로 빼주면 된다.
    • 요소값은 0부터 시작하므로 1을 빼주어야한다.

느낀점

처음에 이 코드를 보고 언더바 (_) 때문에 신경이 쓰여서 해석하기 시작했다. 이 코드에서 쓰일때는 그냥 무시하기위해 쓰였는데, 아래 for문에서는 왜 안씀? 아무튼 언더스코어로 불리고 이에 대해선 링크를 참고.

진짜 느낀점은 망망대해를 보는 느낌이었다.
자만한적도 없지만 함부로 무시하지 말고 더욱 겸손히 공부해야겠다.
이 코드를 해석하는데 시간이 어마어마하게 들어갔지만, 얻는게 많았다고 생각이 들어서 기분이 좋다.

profile
개발자가 되고싶당

0개의 댓글