- [ 장르 ] STACK
- [ 문제 ]
- My Code
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<int> prices) {
vector<int> answer;
int NoDownDuring; // 해당시점 이후, 주식가격 낮아지기까지 시간체크
answer.assign(prices.size(), 0); // 주식 수 만큼 정답 벡터 0으로 초기화
for(int i = 0 ; i < prices.size(); i++)
{
NoDownDuring = 0; // 시간측정은 현 시점부터 0부터 시작
for(int j = i + 1; j < prices.size(); j++)
{
NoDownDuring++;
if(prices[i] > prices[j]) // 현 시점 주식에서 뒤에 주식중에 현 시점 주식보다 낮은 시점
break;
}
answer[i] = NoDownDuring; // 현 시점에서 주식이 낮아지기까지 시간 벡터에 삽입
}
return answer;
}
- Another Code
#include <string>
#include <vector>
#include <stack>
using namespace std;
vector<int> solution(vector<int> prices)
{
vector<int> answer(prices.size());
stack<int> s;
int size = prices.size();
for (int i = 0; i<size; i++)
{
// 스텍이 차있으면서 가격이 떨어지기 시작하면
while (!s.empty() && prices[s.top()] > prices[i])
{
answer[s.top()] = i - s.top();
s.pop();
}
// 가격이 올라갈때동안 스텍에 넣음
s.push(i);
}
// 스텍에 남은것들을 계산해줌
while (!s.empty())
{
answer[s.top()] = size - s.top() - 1;
s.pop();
}
return answer;
}
" 알고리즘 풀 때는 성능(주로, 실행시간) 에 대해서 생각을 해보자. "
[ CheckPoint ]
- 문제 의도만 파악하면, 문제는 어렵지 않은 문제다.
- 주된 장르는 스택인데, 나는 풀고나니 스택을 안았다. 스택을 써야하는 발상이 나지 않았다.
- 풀고나서보니, 최악의 상황 prices 벡터크기가 10000개이고, 모든 주식 가격이 같다면, 총 실행시간은 O(n^2)시간이 될 수 있다. 이는 굉장히 비효율적일 수 있는데, 이 문제는 이 사항은 수용하기로 했나보다.
- 다른 사람의 코드를 보면, 반복문이 2개가지만, 스택을 잘 활용해서 적어도 O(n^2)의 시간은 걸리지 않다는 것을 알 수있다.
728x90
반응형
'Algorithm Practice > [ 프로그래머스 ]' 카테고리의 다른 글
[프로그래머스][#42747] H-Index (0) | 2020.09.18 |
---|---|
[프로그래머스][#42583] 다리를 지나는 트럭 (0) | 2020.09.16 |
[프로그래머스] [#42586] 기능개발 (0) | 2020.09.15 |
[프로그래머스][#42746] 가장 큰수 (0) | 2020.09.12 |
[프로그래머스] [#42587] 프린터 (0) | 2020.09.11 |