Do Something

[프로그래머스][c++] [스택/큐]주식가격(stack) 본문

프로그래머스

[프로그래머스][c++] [스택/큐]주식가격(stack)

뭐라도해야겠다 2022. 1. 25. 17:16

문제 설명

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.

제한사항
  • prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
  • prices의 길이는 2 이상 100,000 이하입니다.
입출력 예pricesreturn
[1, 2, 3, 2, 3] [4, 3, 1, 1, 0]
입출력 예 설명
  • 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
  • 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
  • 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
  • 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
  • 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.

※ 공지 - 2019년 2월 28일 지문이 리뉴얼되었습니다.

 

문제는 간단했다

주식가격이 손해는 아닌 시간을 구하면 된다

스택에 <가격,번호>를 넣고 앞에게 더 작은게 남아있으면 쭉 빼면서 초를 확정시켜주면 된다. 

#include <string>
#include <vector>
#include <iostream>
#include <stack>
using namespace std;

vector<int> solution(vector<int> prices) {
    vector<int> answer(prices.size());
    int visit[10001] = {0,};
    int prices_size = prices.size();
    stack<pair<int,int>> stuck;
    for(int i=0;i<prices.size();i++){
        if(stuck.empty()){
            stuck.push({prices[i],i});
        }
        else{
            while(stuck.top().first >prices[i]){
                answer[stuck.top().second] = i-stuck.top().second;
                stuck.pop();
                if(stuck.empty()) break;
            }
            stuck.push({prices[i],i});
        }
    }
    if(!stuck.empty()){
        int tmp = stuck.top().second;
        stuck.pop();
        while(!stuck.empty()){
            answer[stuck.top().second] = tmp - stuck.top().second;
            stuck.pop();
        }
    }
    for(auto K:answer){
        cout<<K<<" ";
    }
    return answer;
}


int main(void){
    solution({10,9,8,7,6,5,4,3,2,1});
}

이번문제는 효율성 테스트까지 있는데 시간이 꽤 많이 걸린 것 같다. 

왜지..쓸데없는 for문은 딱히 없는데 잘 모르겠다

원래 큰건가 

비교대상이 없는게 좀 아쉽다.