Study/Coding Test
[스택/큐] 주식가격
_gayeon
2021. 1. 29. 18:59
programmers.co.kr/learn/courses/30/lessons/42584
코딩테스트 연습 - 주식가격
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은 1 이상 10,00
programmers.co.kr
문제 설명
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.
제한사항
- prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
- prices의 길이는 2 이상 100,000 이하입니다.
입출력 예
prices | return |
[1, 2, 3, 2, 3] | [4, 3, 1, 1, 0] |
입출력 예 설명
- 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
- 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
- 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
- 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
- 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.
Sol1) 반복문 + 조건문
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<int> prices) {
vector<int> answer;
for(int i=0; i<prices.size(); i++){
int pivot = prices[i];
int j;
for(j=i+1; j<prices.size(); j++){
if(pivot > prices[j]){
answer.push_back(j-i);
break;
}
}
if(j == prices.size())
answer.push_back(prices.size()-i-1);
}
return answer;
}
Sol2) 스택
#include <string>
#include <vector>
#include <stack>
using namespace std;
vector<int> solution(vector<int> prices) {
vector<int> answer(prices.size());
stack<int> s;
for(int i=0; i<prices.size(); i++){
while(!s.empty() && (prices[i] < prices[s.top()])){
answer[s.top()] = i-s.top();
s.pop();
}
s.push(i);
}
while(!s.empty()){
answer[s.top()] = prices.size() - s.top() - 1;
s.pop();
}
return answer;
}
알고리즘
- prices의 인덱스를 저장하게될 스택을 생성한다. (s)
- 반복문으로 돌면서 prices의 값이 커지면 스택에 넣고
- prices가 작아지는 지점에서는 answer의 해당 위치에 값(i-s.top())을 저장하고 pop 시킨다. (이렇게 해당위치에 바로 접근하기 위해서 answer 벡터의 크기를 미리 prices의 크기로 할당해 놓는다.)
- 위 내용은 반복한다. 이전의 값들도 여기서 prices가 작아질 수도 있으니까!
- 반복문이 다 돈 후에 스택에 남아있는 값들은 s.size()-s.top()-1의 값으로 채우면서 pop시키며 채운다.
* 즉, stack에는 prices의 값이 증가할 때까지 저장하다가 줄어드는 시점에서 pop시키면서 동시에 해당 지점에 해당하는 값을 answer에 저장한다. 그러다 스택에 남아있는 값들은 이후의 값이 모두 커지는 경우일 것이다.
후기)
이 문제는 이중 포문으로 풀기에는 매우 쉬웠지만 스택을 사용하자니 풀이가 잘 생각나지 않았다.
스택을 사용하면 O(n)으로 풀 수 있으니 알아두자.