append()
와 pop()
을 이용해 스택을 구현할 수 있다.stack = []
stack.append(1) # 삽입 O(1)
stack.pop() # 삭제 O(1)
stack[-1] # 삭제 하지 않고 최상단 원소 가져오기
print(stack) # 최하단 원소부터 출력
print(stack[::-1]) #최상단 원소부터 출력
O(n)
이기 때문에 라이브러리를 사용해서 구현해주는 것이 좋음!collections
에서 제공하는 deque
를 사용한다.from collections import deque
pop()
: 오른쪽(마지막) 값 출력 시
popleft()
: 왼쪽(처음) 값 출력 시
append()
: 오른쪽에 값 입력
appendleft()
: 왼쪽에 값 입력
from collections import deque
list = []
queue = deque(list)
queue.append(1) # 삽입 O(1)
queue.popleft() # 삭제 O(1)
.popleft()
로 맨 앞 원소를 추출해주고 반복문을 돌면서 큐 안의 원소보다 크다면 time
을 1씩 증가시켜준다. break
를 통해 반복문을 탈출하고, 해당하는 time
을 answer
에 append
해준다.from collections import deque
def solution(prices):
answer = []
prices_q = deque(prices)
while prices_q:
price = prices_q.popleft()
time = 0
for q in prices_q:
time += 1
if price > q:
break
answer.append(time)
return answer
별로 어려운 문제가 아니라 쉽게 통과했지만, 다른사람들의 풀이를 참조하고 싶어서 구글링 한 결과 스택을 이용하면 시간복잡도측면에서 훨씬 이득이라는 것을 발견!
큐를 이용하면 맨 앞의 값을 popleft()
해서 그 가격을 뒤의 가격들과 비교만 하면 되는데 스택을 이용할 땐 가격을 어떻게 비교하는지 감이 잘 잡히지 않았다.
그래서 좋은 벨로그 글을 공유합니닷 👉참조한 글
스택을 이용하여 어떻게 풀었는지 자세하게 설명해주셨다.
def solution(prices):
length = len(prices)
# answer을 max값으로 초기화
answer = [ i for i in range (length-1, -1, -1)]
# 주식 가격이 떨어질 경우 찾기
stack = [0]
for i in range (1, length):
while stack and prices[stack[-1]] > prices[i]:
j = stack.pop()
answer[j] = i - j
stack.append(i)
return answer
내 방식대로 이해한 알고리즘을 적자면
answer
를 값이 '떨어지지 않는다' 는 가정을 한 리스트로 바꾼다.
(prices = [1, 2, 3, 2, 3]
이라면,answer = [4, 3, 2, 1, 0]
이렇게)- 주식 가격이 떨어질 경우를 찾는다.
prices
를 순회할 때 주식 가격이 계속 오르고 있다면answer
는 수정할 필요가 없다.
하지만 주식 가격이 떨어진다면
1.stack
에 저장된 인덱스와 비교(stack
에는 현재 순회하는 인덱스가append
됨)
2. 감소하는 경우라면 해당answer
의 값을주식가격이 감소할 때의 인덱스 - stack의 인덱스
로answer
에 값을 업데이트
이런식인데, stack
에는 현재 순회하는 인덱스를 append
해주고, while
문은 가격이 떨어질 경우에 수행하는 반복문이다.
만약에 가격이 떨어진다면, stack
의 최상단의 원소를 pop
해주고(현재 순회하는 인덱스가 가격이 떨어지는 시점이므로) answer
에 시간을 계산해서 담아준다. 이를 stack
이 빌 때 까지 반복
큐 보다 구현하기 어렵지만 시간복잡도 측면에선 2배 정도 이득이라 알아두면 좋은 방법인듯 하다!!