탑

2019, Jun 02    
  • https://programmers.co.kr/learn/courses/30/lessons/42588
  • 스택 자료구조를 이용하여 풀 수 있는 문제 입니다.
  • 현재 인덱스 기준으로 왼쪽에 있는 데이터에만 관심이 있고 왼쪽의 있는 값중에서 현재 값 보다 큰 가장 가까운 값이 몇번 인덱스에 있는지 확인해야 합니다.
  • 이 문제를 스택으로 푸는 이유는 현재 인덱스 기준으로 왼쪽의 모든 값을 가지고 있을 필요가 없고 필요한 값들만 스택에 저장한 다음 매번 필요없다고 판단되면 pop을 하면 되기 때문입니다.
    • 예를 들어 (2, 4, 5, 3)에서 3은 5라는 값에 의해서 4라는 값은 볼 필요가 없습니다.
    • 왜냐하면 탑의 높이 5에서 먼저 신호를 받기 때문에 4에서는 받을 수 없기 때문입니다.
  • 즉 배열값을 스택에 쌓고 필요없으면 pop 하기 때문에 시간 복잡도 면에서도 유리합니다.
#include <string>
#include <vector>

using namespace std;

struct DS {
	int height;
	int idx;
	DS(int _height, int _idx) : height(_height), idx(_idx) {}
};

vector<int> solution(vector<int> heights) {
    vector<int> answer;

    vector<DS> v;
	vector<DS> s;
	for (int i = 0; i < heights.size(); ++i) {
		v.push_back(DS(heights[i], i + 1));
	}
	
	int i = 0;
	while(i<v.size()){
		auto here = v[i];

		if (s.empty()) {
			answer.push_back(0);
			s.push_back(here);
			i++;
		}
		else if (s.back().height <= here.height) {
			s.pop_back();
		}
		else if (s.back().height > here.height) {
			answer.push_back(s.back().idx);
			s.push_back(here);
			i++;
		}
	}
    
    return answer;
}