코딩테스트 및 개인공부/문제풀이
[프로그래머스 - level2] [스택/큐] 주식가격
JJPearl
2021. 10. 29. 01:40
반응형
문제 설명
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.
제한사항
- prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
- prices의 길이는 2 이상 100,000 이하입니다.
입출력 예
prices | return |
[1, 2, 3, 2, 3] | [4, 3, 1, 1, 0] |
1번을 제외하고 오답이 나올때는 prices = {1, 2, 3, 2, 3, 1} return {5, 4, 1, 2, 1, 0}의 예를 하나씩 따라가면서 이해하면 풀린다
입출력 예 설명
- 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
- 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
- 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
- 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
- 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.
<문제 이해를 돕기 위한 재해석>
문제설명
n초 간의 주가를 초 단위로 기록한 배열 prices가 매개변수로 주어질 때, 각 초의 주가를 기준으로 해당 초 부터 n초 사이에 가격이 떨어지지 않은 시간은 몇 초인지 배열에 담아 return 하도록 solution 함수를 완성하세요.
입출력 예
prices : [1, 2, 3, 2, 3]
return : [4, 3, 1, 1, 0]
입출력 예 설명
1초의 주가는 1이며 1초부터 5초까지 총 4초간 주가를 유지했습니다.
2초의 주가는 2이며 2초부터 5초까지 총 3초간 주가를 유지했습니다.
3초의 주가는 3이며 4초의 주가는 2로 주가가 떨어졌지만 3초에서 4초가 되기 직전까지의 1초간 주가가 유지 된것으로 봅니다. 따라서 5초까지 총 1초간 주가를 유지했습니다.
위의 예시를 이해하실때
'현재가격을 기준으로 1초후 다음 가격이 떨어졌다면 이후에 가격은 상관없이 가격이 떨어지지않은 기간은 1초로 간주한다'로 이해하셔야 문제에서 요구하는 답을 낼 수 있는것 같습니다.
따라서 문제 예시에서도 3->2초 , 다시 2->3초로 가격이 상승하여도 해당 3초시점의 가격은 1초간 떨어지지 않은 것으로 간주하고 있습니다.
4초의 주가는 2이며 4초부터 5초까지 총 1초간 주가를 유지했습니다.
5초의 주가는 3이며 5초 이후로는 데이터가 없으므로 총 0초간 주가를 유지했습니다.
풀이 과정
주가 prices[i] 를 queue에 반복문으로 넣는다는 개념
-> 이유: queue를 쓴 이유는 제일 첫번째 들어온 원소보다 작은 값이 들어올 때 까지 주가가 유지되는 것이기 때문
내부 반복문에서 queue에 front보다 작은 값이 들어올 때 까지 prices[j] push/ push된 카운트를 저장할 iAnswer 변수
push해줄때 마다 iAnswer++
queue에 front보다 작은 값이 들어왔다면 iAnswer++ 해 준 다음 내부 반복문 break.
-> 이유: 다음 초에 가격이 떨어지더라도 1초간 가격을 유지한걸로 보기 때문에 iAnswer++로 1초를 더해주는 것
내부 반복문 끝나면 외부 반복문에서 answer에 push
인덱스인 i가 마지막 인덱스면 answer에 0 push
코드
#include <string>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
vector<int> solution(vector<int> prices) {
vector<int> answer;
int iAnswer =0;
for (int i = 0; i < prices.size(); ++i) {
if(i < prices.size()-1) {
queue<int> seconds;
seconds.push(prices[i]);
for(int j=i+1;j<prices.size();++j) {
if(seconds.front() <= prices[j]) {
seconds.push(prices[j]);
++iAnswer;
}
else
{
++iAnswer;
if(seconds.size() == 1) {
iAnswer = 1;
}
break;
}
}
answer.emplace_back(iAnswer);
iAnswer = 0;
}
else {
answer.emplace_back(0);
}
}
return answer;
}
근데 내가 푼 방식은 시간복잡도가 O(n^2)일텐데 효율성 테스트가 통과하는게 요상하다.
일단 제대로 된 질문 해석이랑 테스트케이스 보고 로직 짜서 바로 해결한 문제!
반응형