STUDY/Algorithm

[백준] 2493 탑 C++

sinawi95 2022. 10. 11. 22:08
728x90

문제 요약

현재 탑의 크기보다 큰 탑 중 왼쪽으로 가장 가까운 탑찾기

접근

1. 생각의 흐름(Greedy)

출력

  • 아무것도 없을때 0
  • 값이 있으면 해당 인덱스 값 출력 -> (value, index ) 같이 넣어야할듯
    • 저장한 값보다 값이 크면 큰값이 나올때까지 pop
    • 저장한 값보다 값이 작으면 push

전체 코드

#include <iostream>
#include <stack>

#define MAX_N 500000
using namespace std;


int N;
int arr[MAX_N];

int main()
{
    cin >> N;
    for (size_t i = 0; i < N; i++)
        cin >> arr[i];

    stack<pair<int,int>> s; // value, index

    for (size_t i = 0; i < N; i++)
    {
        if (s.empty())
        {
            cout << "0 ";
            s.push({arr[i], i});
        }
        else
        {
            if (s.top().first > arr[i])
            {
                cout << s.top().second + 1 << " ";
                s.push({arr[i], i});
                continue;
            }
            while (!s.empty() && s.top().first < arr[i])
            {
                s.pop();
            }
            if (s.empty())
            {
                cout << "0 ";
            }
            else
            {
                cout << s.top().second + 1 << " ";
            }
            s.push({arr[i], i});
        }
    }
    cout << endl;
    return 0;
}