주식가격

주식가격

2019, Jun 02    
  • https://programmers.co.kr/learn/courses/30/lessons/42584
  • stack 자료구조를 이용하여 풀 수 있는 문제 구조입니다.
  • stack 자료구조를 사용할 수 있는 환경은 보통 배열에서 한쪽 방향으로만 연산을 하는 경우입니다. 즉 »> 방향으로만 고려해야 하는 경우입니다.
  • 이 문제에서도 현재 인덱스 기준으로 오른쪽에 더 작은 값이 최초로 등장하는게 언제인지를 아는 문제입니다.
    • 예를 들어 1, 3, 4, 5, 2 라면 4는(3번인덱스) 2가(5번인덱스)등장하였을 때 최초로 더 작은 값이 들어오게됩니다.
  • 문제의 해법은 스택에 인덱스를 저장하고 스택의 top에 해당하는 인덱스의 값과 현재 탐색하는 인덱스의 값을 비교하여 거리 차이를 구하는 방법입니다.
    • 예를 들어 1, 3, 4, 3, 2가 있다고 가정하겠습니다.
    • 1의 경우 스택이 비어 있으므로 스택에 인덱스를 push 합니다.
      • 스택 : 0
    • 그 다음 3의 경우는 스택의 top 인덱스의 값인 1과 3을 비교하였을 때 1이 3보다 작으므로 스택에 3의 인덱스를 push 합니다.
      • 스택 : 0, 1
    • 그 다음 4의 경우도 앞과 같습니다.
      • 스택 : 0, 1, 2
    • 그 다음 3의 경우는 스택의 top의 인덱스 값인 4와 3을 비교하였을 때 4가 3보다 크므로 거리를 계산합니다.
    • 스택의 top의 인덱스의 경우 최초로 값이 줄어드는 지점을 확인 하였으므로 pop을 합니다.
    • 계속하여 스택의 top에 같은 작업을 수행합니다. 그 다음 top의 값은 3이므로 줄어들지 않습니다. 따라서 이번 케이스는 종료됩니다.
      • 스택 : 0, 1
    • 마지막인 2의 경우와 스택의 top을 비교하면 3 > 2가 되므로 거리를 계산하고 스택을 pop 합니다.
    • 다시 한번 스택의 top과 2를 비교하면 1 < 2가 되므로 종료합니다.
      • 스택 : 0
  • 마지막으로 스택에 남아있는 값은 끝까지 줄어들지 않았으므로 (배열의 전체 길이 - 스택에 저장된 인덱스)를 이용하여 얼마만큼 계속 증가하였는지 구합니다.
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <stack>

using namespace std;

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

	stack<int>s;
	for (int i = 0; i < prices.size(); ++i) {
		while (!s.empty()) {
			if (prices[s.top()] > prices[i]) {
				answer[s.top()] = i - s.top();
				s.pop();
			}
			else {
				break;
			}
		}
		s.push(i);
	}

	while (!s.empty()) {
		answer[s.top()] = prices.size() - s.top() - 1;
		s.pop();
	}

	return answer;
}