• toc {:toc}

문제

KOI ν†΅μ‹ μ—°κ΅¬μ†ŒλŠ” λ ˆμ΄μ €λ₯Ό μ΄μš©ν•œ μƒˆλ‘œμš΄ λΉ„λ°€ 톡신 μ‹œμŠ€ν…œ κ°œλ°œμ„ μœ„ν•œ μ‹€ν—˜μ„ ν•˜κ³  μžˆλ‹€. μ‹€ν—˜μ„ μœ„ν•˜μ—¬ 일직선 μœ„μ— N개의 높이가 μ„œλ‘œ λ‹€λ₯Έ 탑을 μˆ˜ν‰ μ§μ„ μ˜ μ™Όμͺ½λΆ€ν„° 였λ₯Έμͺ½ λ°©ν–₯으둜 μ°¨λ‘€λ‘œ μ„Έμš°κ³ , 각 νƒ‘μ˜ κΌ­λŒ€κΈ°μ— λ ˆμ΄μ € 솑신기λ₯Ό μ„€μΉ˜ν•˜μ˜€λ‹€. λͺ¨λ“  νƒ‘μ˜ λ ˆμ΄μ € μ†‘μ‹ κΈ°λŠ” λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μ§€ν‘œλ©΄κ³Ό ν‰ν–‰ν•˜κ²Œ μˆ˜ν‰ μ§μ„ μ˜ μ™Όμͺ½ λ°©ν–₯으둜 λ°œμ‚¬ν•˜κ³ , νƒ‘μ˜ κΈ°λ‘₯ λͺ¨λ‘μ—λŠ” λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μˆ˜μ‹ ν•˜λŠ” μž₯μΉ˜κ°€ μ„€μΉ˜λ˜μ–΄ μžˆλ‹€. ν•˜λ‚˜μ˜ νƒ‘μ—μ„œ λ°œμ‚¬λœ λ ˆμ΄μ € μ‹ ν˜ΈλŠ” κ°€μž₯ λ¨Όμ € λ§Œλ‚˜λŠ” 단 ν•˜λ‚˜μ˜ νƒ‘μ—μ„œλ§Œ μˆ˜μ‹ μ΄ κ°€λŠ₯ν•˜λ‹€.

예λ₯Ό λ“€μ–΄ 높이가 6, 9, 5, 7, 4인 λ‹€μ„― 개의 탑이 μˆ˜ν‰ 직선에 일렬둜 μ„œ 있고, λͺ¨λ“  νƒ‘μ—μ„œλŠ” μ£Όμ–΄μ§„ 탑 μˆœμ„œμ˜ λ°˜λŒ€ λ°©ν–₯(μ™Όμͺ½ λ°©ν–₯)으둜 λ™μ‹œμ— λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό λ°œμ‚¬ν•œλ‹€κ³  ν•˜μž. 그러면, 높이가 4인 λ‹€μ„― 번째 νƒ‘μ—μ„œ λ°œμ‚¬ν•œ λ ˆμ΄μ € μ‹ ν˜ΈλŠ” 높이가 7인 λ„€ 번째 탑이 μˆ˜μ‹ μ„ ν•˜κ³ , 높이가 7인 λ„€ 번째 νƒ‘μ˜ μ‹ ν˜ΈλŠ” 높이가 9인 두 번째 탑이, 높이가 5인 μ„Έ 번째 νƒ‘μ˜ μ‹ ν˜Έλ„ 높이가 9인 두 번째 탑이 μˆ˜μ‹ μ„ ν•œλ‹€. 높이가 9인 두 번째 탑과 높이가 6인 첫 번째 탑이 보낸 λ ˆμ΄μ € μ‹ ν˜ΈλŠ” μ–΄λ–€ νƒ‘μ—μ„œλ„ μˆ˜μ‹ μ„ ν•˜μ§€ λͺ»ν•œλ‹€.

νƒ‘λ“€μ˜ 개수 Nκ³Ό νƒ‘λ“€μ˜ 높이가 μ£Όμ–΄μ§ˆ λ•Œ, 각각의 νƒ‘μ—μ„œ λ°œμ‚¬ν•œ λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μ–΄λŠ νƒ‘μ—μ„œ μˆ˜μ‹ ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

μž…λ ₯

첫째 쀄에 νƒ‘μ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ N이 μ£Όμ–΄μ§„λ‹€. N은 1 이상 500,000 μ΄ν•˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” N개의 νƒ‘λ“€μ˜ 높이가 직선상에 놓인 μˆœμ„œλŒ€λ‘œ ν•˜λ‚˜μ˜ λΉˆμΉΈμ„ 사이에 두고 μ£Όμ–΄μ§„λ‹€. νƒ‘λ“€μ˜ λ†’μ΄λŠ” 1 이상 100,000,000 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 μ£Όμ–΄μ§„ νƒ‘λ“€μ˜ μˆœμ„œλŒ€λ‘œ 각각의 νƒ‘λ“€μ—μ„œ λ°œμ‚¬ν•œ λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μˆ˜μ‹ ν•œ νƒ‘λ“€μ˜ 번호λ₯Ό ν•˜λ‚˜μ˜ λΉˆμΉΈμ„ 사이에 두고 좜λ ₯ν•œλ‹€. λ§Œμ•½ λ ˆμ΄μ € μ‹ ν˜Έλ₯Ό μˆ˜μ‹ ν•˜λŠ” 탑이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ 0을 좜λ ₯ν•œλ‹€.

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

풀이

문제λ₯Ό ν’€λ©΄μ„œ μž…λ ₯λ°›λŠ” μ°¨λ‘€λŒ€λ‘œ 값을 μŠ€νƒμ— λ„£κ³  더 큰 값이 올 경우 μ›λž˜ 있던 값이 ν•„μš”κ°€ μ—†μ–΄μ§„λ‹€λŠ” 것을 μ•Œμ•˜λ‹€.

ν•˜μ§€λ§Œ μœ„μΉ˜ν•œ νƒ‘λ“€μ˜ μˆœμ„œλ₯Ό μ •ν•˜λŠ” λΆ€λΆ„μ—μ„œ ν—€λ§Έκ³  정닡을 μ°Ύμ§€ λͺ»ν–ˆλ‹€.

// μ†‘μ‹ νƒ‘μ˜ μ™Όμͺ½μœΌλ‘œ μ‹ ν˜Έλ₯Ό 쀌. μ™Όμͺ½μ— 높은 탑이 μžˆμ–΄μ•Ό 함.
#include <bits/stdc++.h>
 
using namespace std;
 
// 측을 μ €μž₯ν•˜λŠ” 방법 생각해보기
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, res = 0;
    stack<pair<int, int>> s;
    cin >> n;
    s.push({100000001, 0});
    for(int i=1; i<=n; i++){
        int p;
        cin >> p;
        if(s.empty() || p > s.top().first){
            while(p > s.top().first){
                s.pop();
            }
            res = s.top().second;
            cout << res << ' ';
        }
        else{
            res = s.top().second;
            cout << res << ' ';
        }
        s.push({p, i});
    }
 
    return 0;
}

μ •λ‹΅μ½”λ“œλ₯Ό ν†΅ν•΄μ„œ pairλ₯Ό 톡해 μ„€μ •ν•˜λŠ” 방식을 μ•Œμ•„λƒˆμŒ.