백준: Class 6 - 3015

1 분 소요


</br> 클래스 6 계속
</br>

3015: 오아시스 재결합

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

#include <bits/stdc++.h>

using namespace std;

int nums[500001];
stack< pair<int, int> > st;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int n;
    cin >> n;

    for(int i = 0; i < n; i++){
        cin >> nums[i];
    }

    long long ans = 0;
    for(int i = 0; i < n; i++){
        pair<int, int> p = {nums[i], 1};
        while( st.size() ){
            if( st.top().first <= nums[i] ){
                ans += st.top().second;
                if( nums[i] == st.top().first ) p.second += st.top().second;
                st.pop();
            }
            else{
                ans++;
                break;
            }
        }
        st.push(p);
    }

    cout << ans << endl;

}

어렵다 풀이를 봐 버렸다
스택에 (키, 같은 키 수)로 저장해서, 만약 스택의 키보다 현재 키가 같거나 크면 스택의 같은 키 수를 답에 더한다(걔네랑은 다 가능하기 때문에). 그리고 스택의 키와 현재 키가 같다면 같은 키를 추가해 줘야 하니까 카운트를 그 만큼 늘린다.
만약 스택의 키가 현재 키보다 크다면, 그 쌍만 가능하므로 답에 하나를 추가하고 멈춘다.

ex)
6
6 6 6 5 2 5

6 6
6 6 6
6 6
6 5
5 2
5 2 5
2 5
6 5 2 5
로 답은 8임


[6] 6 6 5 2 5
stack: (6, 1)

6 [6] 6 5 2 5
stack: 
    6 <= 6
    ans += 1    {6 6}
    6 == 6이므로 카운트 +1
stack: (6, 2)
ans = 1

6 6 [6] 5 2 5
stack: 
    6 <= 6
    ans += 2    {6 6} {6 6 6}
    6 == 6이므로 카운트 +1
stack: (6, 3)
ans = 3

6 6 6 [5] 2 5
stack: (6, 3) 
    6 > 5
    ans += 1    {6 5}
    break
stack: (6, 3) (5, 1)
ans = 4

6 6 6 5 [2] 5
stack: (6, 3) (5, 1)
    5 > 2
    ans += 1    {5 2}
    break
stack: (6, 3) (5, 1) (2, 1)
ans = 5

6 6 6 5 2 [5]
stack: (6, 3) (5, 1) (2, 1)
    2 <= 5
    ans += 1    {2 5}
    2 != 5
ans = 6

stack: (6, 3) (5, 1)
    5 <= 5
    ans += 1    {5 2 5}
    5 == 5이므로 카운트 +1
ans = 7

stack: (6, 3) 
    6 > 5
    ans += 1    {6 5 2 5}
    break
stack: (6, 3) (5, 2)
ans = 8


</br>


정말 열심히 하자
</br>

댓글남기기