주식가격의 다른사람이 푼 풀이를 보면서 큰 공부가 되어서 적는다.
문제 링크
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]]위의 결과는 추천 테스트 케이스의 입력 결과이다.
- 첫번째
for문이 돌아갈 때if를 만족하지 않기 때문에 바로append로 넘어간다.
- 이때
[0, 5]가 입력된다.- 두번째에선
if를 만족하지만while을 만족하지 않기 때문에 지나간다.- 세번째 순서에서
stack[-1][1] = 8,prices[i] = 6이기 때문에while문 내부로 진입한다.
while내부에서는i번째 인덱스와 이전 숫자의 인덱스를 빼준다.- 이 시간이 곧 가격이 떨어진 시점이다.
[0, 1, 1, 0, 0, 0]일 때까지 진행한 후에 곧바로[3, 1, 1, 0, 0, 0]으로 바뀌게된다.
이 부분 때문에 이 글을 쓰게되었다
while문은 조건이 만족되는 한 계속해서 돌아가게 되어있다.- 즉
3번째 요소값인2와0번째 요소값인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]]
- 중간에 자신보다 작아지는 숫자가 없으면 아래
for문으로 내려간다.
- 자신보다 작아지는 숫자가 없다는 뜻임으로 끝까지의 인덱스를 자신의 인덱스로 빼주면 된다.
- 요소값은
0부터 시작하므로1을 빼주어야한다.
처음에 이 코드를 보고 언더바 (_) 때문에 신경이 쓰여서 해석하기 시작했다. 이 코드에서 쓰일때는 그냥 무시하기위해 쓰였는데, 아래 for문에서는 왜 안씀? 아무튼 언더스코어로 불리고 이에 대해선 링크를 참고.
진짜 느낀점은 망망대해를 보는 느낌이었다.
자만한적도 없지만 함부로 무시하지 말고 더욱 겸손히 공부해야겠다.
이 코드를 해석하는데 시간이 어마어마하게 들어갔지만, 얻는게 많았다고 생각이 들어서 기분이 좋다.