[프로그래머스 Level 2] 주식가격

🖊️ 문제

주식가격  

 

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

 

제한사항

  • prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
  • prices의 길이는 2 이상 100,000 이하입니다.

 

입출력 예

입출력 예 설명

  • 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
  • 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
  • 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
  • 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
  • 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.

 

🖥️ 코드

중첩 for문 사용

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> prices)
{
	int size = prices.size();
	vector<int> answer(size);

	for (int i = 0; i < size; i++)
	{
		int count = 0;
		for (int j = i + 1; j < size; j++)
		{
			count++;
			if (prices[i] <= prices[j]) continue;
			else break;
		}
		answer[i] = count;
	}

	return answer;
}

 

stack 사용

#include <string>
#include <vector>
#include <stack>

#include <iostream>

using namespace std;

vector<int> solution(vector<int> prices) 
{
    vector<int> answer(prices.size());
    stack<int> st;
    
    for(int time = 0; time < prices.size(); time++)
    {
        
        while(!st.empty() && prices[st.top()] > prices[time])
        {
            answer[st.top()] = (time-st.top());
            st.pop();
        }
        
        st.push(time);
    }
    
    while(!st.empty())
    {
        answer[st.top()] = prices.size() - st.top() - 1;
        st.pop();
    }
    
    return answer;
}

 

🤔 나의 생각

  • 문제가 조금 헷갈렸지만 주어진 예시에서 숫자를 바꿔가며 써보니 쉽게 해결할 수 있었다.
    • 참고로 문제 예시인 [1, 2, 3, 2, 3]과 [1, 2, 3, 2, 0]의 정답이 동일하다는 것만 캐치하면 문제 이해는 끝났다!
  • 중첩 for로 풀어보고 stack으로도 풀어봤다. 중첩 for로 문제가 해결되는 것 보면 효율성 검사가 타이트하진 않은 듯하다.
    • 중첩 for : 자기 자신보다 작은 값이 나오면 내부 for를 탈출해 정답을 갱신하는 매우 직관적인 코드다.
    • stack : stack의 top이 자신보다 작거나 같을 때까지 pop 하며 정답을 갱신한다.
  • stack에 대해서 한 번쯤 깊게 생각해야 할 부분이 있다. 배열에 스택을 사용해야 할 때 원소를 넣기보단 인덱스를 넣는 것이 대다수의 상황에서 깔끔하게 풀어진다. 인덱스로 값에 접근할 수 있지만 값으로 인덱스를 접근하려면 코딩이 꼬이기 시작한다.