본문 바로가기
백준 문제 해설

백준 2493 탑

by toomanysegtrees 2022. 11. 25.

내일 아티스틱 스위밍 대회한다. 많이 기대된다.

https://www.acmicpc.net/problem/2493

 

2493번: 탑

첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1

www.acmicpc.net

풀이

stack을 사용해 해결해줄 수 있는 문제이다. 특정 위치에 있어서 해당 위치 이전에 있는 탑들이 현재 위치에 있는 탑들보다 작을 경우 이후의 탑들에서 해당 작은 탑들에 도달할 수 있는 방법은 없다. 이 원리를 이용해 한번 탐색해준 탑은 사용하거나 제거해줄 수 있는 것이다. (시간 복잡도 $O(N)$)

 

감상

이제 이런 문제들은 쉽게 풀린다. 보람이 있다.

/* basic setup {{{ */
#include<bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
#define sz(x) ((int)x.size())
#define all(x) x.begin(),x.end()
#define compress(x) sort(all(x)), x.erase(unique(all(x)), x.end())
#define fast_io ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define F0R(i,a) FOR(i,0,a)
#define ROF(i,a,b) for (int i=(b)-1;i>=(a);--i)
#define R0F(i,a) ROF(i,0,a)
#define trav(a,x) for (auto& a: x)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef const int ci;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
/*}}}*/
int n;
vector<int> v;
int main(){
	fast_io;
	cin>>n;
	v.resize(n);
	for(int i=0;i<n;i++){
		cin>>v[i];
	}
	stack<pii> s;
	for(int i=0;i<n;i++){
		while(!s.empty() && s.top().ff < v[i]){
			s.pop();
		}
		if(s.empty()){
			s.push({v[i],i});
			cout<<0<<' ';
			continue;
		}
		cout<<s.top().ss+1<<' ';
		s.push({v[i],i});
	}

	cout<<'\n';
}

'백준 문제 해설' 카테고리의 다른 글

백준 25380 커다란 도시  (0) 2023.05.15
백준 20649 Stuck in a Rut  (0) 2022.11.28
백준 18320 Loan Repayment  (0) 2022.11.27
백준 4435 중간계 전쟁  (0) 2022.11.26
백준 7595 Triangles  (0) 2022.11.24
백준 17267 상남자  (1) 2022.11.23
백준 16234 인구 이동  (0) 2022.11.22
백준 25386 라즈베리 파이  (0) 2022.11.21