관리 메뉴

민우의 코딩노트

3015번 오아시스 재결합 - C++ 본문

Algorithm/BOJ

3015번 오아시스 재결합 - C++

미미누 2022. 7. 24. 21:57

[문제]
https://www.acmicpc.net/problem/3015

3015번: 오아시스 재결합

첫째 줄에 줄에서 기다리고 있는 사람의 수 N이 주어진다. (1 ≤ N ≤ 500,000) 둘째 줄부터 N개의 줄에는 각 사람의 키가 나노미터 단위로 주어진다. 모든 사람의 키는 231 나노미터 보다 작다. 사람

www.acmicpc.net


[풀이]
스택에 넣을때 순감소 수열(Ex 10 9 8 ..)이 되도록 넣어야 한다.
중복 되는 경우(Ex 2 2 2)를 고려해야 한다.

1. 스택의 top()보다 지금 값이 큰 경우
순감소 수열이 되어야 하므로, 스택의 second 값인 중복 누적 값을 더하고, top()을 pop 한다.

2. 스택의 top()보다 지금 값이 같은 경우
순감소 수열이 되어야 하므로, 스택의 second 값인 중복 누적 값을 더하고, 변수 nu에 중복 누적 값+1을 해준다.
3. 스택의 top()보다 지금 값이 작은 경우
순감소 수열을 만족하므로, 스택에 넣어주면 된다.

위 조건에 상관없이 스택에 변수가 남아있는 경우, ans+=1(맞닿아 있는 경우)를 해주면 된다.

[코드]

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int n;
    long long ans = 0;
    cin >> n;
    stack<pair<int, int>> S;
    
    while(n--){
        int t;
        cin >> t;
        int nu = 1;
        while(!S.empty() && S.top().first<=t){
            if(S.top().first == t){
                ans += S.top().second;
                nu = S.top().second+1;
                S.pop();
            }
            else {
                ans += S.top().second;
                S.pop(); nu = 1;
            }
        }
        if(!S.empty()) {
            ans++;
        }
        S.push({t, nu});
    }
    cout << ans;
}

'Algorithm > BOJ' 카테고리의 다른 글

18258번 큐 2 - C++  (0) 2022.07.25
6549번 히스토그램에서 가장 큰 직사각형 - C++  (0) 2022.07.25
10773번 제로 - C++  (0) 2022.07.16
10828번 스택 - C++  (0) 2022.07.16
백준 2493번 - 탑 C++  (0) 2022.04.23