PS

BOJ 2493 : 탑

lickelon 2024. 3. 27. 23:27
  • 문제 링크 : boj.kr/2493
  • 난이도 : G5
  • 태그 : 스택
 

2493번: 탑

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

www.acmicpc.net


코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

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

    int n;
    cin >> n;
    stack<pii> _st;
    for(int i = 0; i < n; i++) {
        int input;
        cin >> input;
        while(!_st.empty()) {
            if(_st.top().first >= input) {
                break;
            }
            _st.pop();
        }
        cout << (_st.empty() ? 0 : _st.top().second + 1) << " ";
        _st.push({input, i});
    }

    return 0;
}

풀이

가장 단순하게 생각해보면 i번째 탑의 레이저가 어디에 도달하는지 확인하기 위해 i-1부터 1번째 탑까지 확인할 수 있다.

다만 이렇게 할 경우 시간복잡도가 $O(N^2)$으로 시간초과가 발생한다.

 

필요하지 않은 확인을 제거해보자.

k번째 탑의 높이를 $A_k$라고 한다면 $i < j$이고 $A_i < A_j$라면 j번째 이후의 탑에서는 i번째 탑을 확인할 필요가 없다. i번째 탑에 도달할 신호는 j번째 탑에 먼저 도달하기 때문이다.

따라서 우리가 확인해야 할 탑의 높이를 순번대로 나열한 배열의 k번째 원소를 $B_k$라고 했을 때, $i<j$라면 $B_i > B_j$이다. 새로운 원소 $B$가 추가되었을 때, $B_k < B$인 모든 $B_k$를 제거하고 $B$를 배열에 추가한다.

 

앞의 배열은 스택을 이용하여 쉽게 관리할 수 있다.

현재의 탑의 높이보다 낮은 값은 스택에서 pop하고 현재의 값을 스택에 push해주면 된다.

'PS' 카테고리의 다른 글

BOJ 12796 : 나의 행렬곱셈 답사기  (0) 2024.03.29
BOJ 17298 : 오큰수  (0) 2024.03.28
BOJ 13422 : 도둑  (0) 2024.03.26
BOJ 7775 : 최종 순위  (1) 2024.03.25
BOJ 15551 : if 3  (0) 2024.03.24