[C++]백준2493번 탑

less than 1 minute read

오늘은 백준2638번 탑 문제를 풀어보도록 하자.

스택을 이용하는 문제로 만일 이중포문으로 값을 찾으려한다면 데이터의 갯수가 50만개 까지 들어올 수 있으므로 시간초과가 난다.

따라서 스택에 하나씩 넣어서 비교해주며 O(N)의 시간복잡도 로 찾아야한다.

문제는 다음과 같다.

                               [접근법]

  1. 스택의 구조는 {높이, 인덱스}의 형태로 만들어준다.

  2. 만일 스택이 비어있다면 push를 해주고 비교 값이 스택의 맨 위의 값보다 작다면 스택의 맨 위의 인덱스를 출력 후 push
  
  3. 만일 비교 값이 스택의 맨 위의 값보다 크다면 pop을 하고 비어있다면 이 값이 들어올 동안 비교 값보다 큰 값이 없었다는 얘기이므로 0을 출력해준다.
                                     [코드]
#include <iostream>
#include <stack>
using namespace std;
struct info {
	int height;
	int idx;
};
stack<info>s;
int N, num;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> num;

		while (!s.empty()) {
			if (s.top().height <= num) {
				s.pop();
				if (s.empty()) {
					cout << 0 << ' ';
				}
			}
			else {
				cout << s.top().idx << ' ';
				s.push({ num, i + 1 });
				break;
			}
		}
		if (s.empty()) {
			s.push({ num, i + 1 });
			if (i == 0) {
				cout << 0 << ' ';
			}
		}
	}
}