본문 바로가기
SWE/코테

[성실코딩 18일차] 백준 #2493 탑 / 스택 **

by S나라라2 2018. 11. 5.
반응형

재밌는 문제당


근데 처음엔 stack사용할 생각 못하고, 

만약 높이가 5인 세 번째 탑이 들어오면 배열1~5까지 3으로 초기화하고,

그 후에 높이가 2인 네 번째 탑이 들어오면 배열 1~2까지는 4로 초기화하고,

다음에 높이가 7인 다 섯번째 탑이 들어오면 배열 1~7까지 5로 초기화 

이런 식으로 풀어나가려 했다.

그러면 현재 탑의 높이를 배열의 인덱스로 바로 참조할 수 있으니까! 


근데 탑의 높이가  1억까지 가능하고, 따라서 메모리 초과.


두 번째 생각한 방법은 스택을 사용하는 것이였다. 

현재 들어온 탑의 높이가 스택안의 값보다 크면 pop하고 현재 값 push하기.

현재 들어온 탑의 높이가 스택안의 값보다 작으면 pop하지말고 그대로 push하기


근데 시간초과 나왔다 ㅠㅠ 

그냥 다른 분 코드 보려고한다,,

http://kwanghyuk.tistory.com/57


시간 초과 내 코드

#include <iostream>
#include <stack>

using namespace std;

int top_height[500010] = { 0, };

int main() {

	stack<int> s;
	int n; //탑의 수
	cin >> n;

	// top_height[0] 에 엄청 큰 값 넣어두고
	// stack 초기에 0 넣어둠.
	// 그래서 다른 탑들이 다 높이가 낮으면 0에서 무조건 수신 받을 수 잇도록
	top_height[0] = 987654321;  // 최대값 INT_MAX
	s.push(0);

	for (int i = 1; i <= n; i++) {
		int cur_height;
		cin >> cur_height;
		top_height[i] = cur_height; // 현재 값 저장

		// 출력하기 위해서 
		// stack안의 값이 나의 높이보다 낮으면 다 없애기
		while (top_height[s.top()] < cur_height) {
			s.pop();
		}
		cout << s.top() << " ";

		// stack 안의 값이 같을 수도 잇으니까 pop하고
		// 그 후에 push 하기
		while (top_height[s.top()] <= cur_height) {
			s.pop();
		}
		// 안의 숫자가 더 크면 현재 값 push
		s.push(i);
	}

	return 0;
}
반응형