Algorithm
Algorithm[프로그래머스][스택/큐]주식 가격
soduddl1
2021. 9. 21. 16:00
문제점 1
문제를 제대로 이해하지 못했다.
- 문제 설명
문제에서 주어진 테스트케이스만 이용하여 알고리즘을 짰다. -> 테케 1번 빼고 전부 실패했다.
테스크 케이스 2개를 더 만들어서 알고리즘을 생각했다.
#1 [1, 2, 3, 2, 3, 1]
#2 [5, 8, 6, 2, 4, 1]
#2에서 4초의 2가 나오면 3초의 6만 체크를 하지 않았다. 하지만 1초의 5, 2초의 8입장에서도 주식의 가격이 하락했으므로 가격이 떨어지지 않은 기간으로 체크해주면 안된다.
문제점 2
위의 내용을 수정하여 작성했더니 정확도는 다 맞았으나 효율성이 0점이 나왔다. ->이중for문을 사용하여 O(n^2) 였으나 실패하였다.
이중for문을 수정하여 효율성 테스트 성공
-> 앞에서 뒤로 체크하였으나, 뒤에서 앞으로 체크
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
추가 ++
이중포문을 수정하여 정답은 맞았으나, 문제의 요구사항인 스택/큐를 이용하지 않았다.
스택을 이용하여 알고리즘을 해결하니 효율성이 훨씬 좋아진걸 확인할 수 있었다.
def solution(prices):
answer = [len(prices) - i - 1 for i in range(len(prices))] #각 시점의 기간으로 초기화
stack = [] #주식 가격을 체크할 스택
for i in range(len(prices)): #i는 현재시점이다. 현재 시점에서 stack에 있는 이전의 주식 가격을 체크한다.
while stack: #체크할 주식 가격이 있는 경우만 while문을 돈다.
idx = stack[-1] # idx는 현재시점의 가격와 비교될 주식의 값이다.
if prices[idx] > prices[i]: #주식의 가격이 떨어졌으면
answer[idx] = i-idx #해당 주식이 오른 기간은 현재시점 - 그때 시점이다.
stack.pop() #떨어진 주식은 더이상 체크할 필요가 없어서 pop
else:
break
stack.append(i) #확인한 현재 주식의 값은 과거의 확인될 값이 된다.
return answer