불쾌한 날(스택)

exsoul·2022년 6월 15일
0

문제 설명


농부 희찬이의 N(1≤N≤80,000)마리의 소들은 "bad hair day"를 맞이하였다. 각 소들이 자신들의 촌스런 머리 모양을 부끄러워 하자, 희찬이는 소들이 다른 소들의 머리 모양을 얼마나 알 수 있는지를 알고자 했다.
i번째 소들은 키가 hi(1≤hi≤1,000,000,000) 이며, 동쪽(오른쪽)을 바라보고 서있다. 따라서, i번째 소는 자신의 앞 ( i+1, i+2,...)의 소들의 머리 모양만 볼 수 있으며, 앞에 자신의 키와 같거나 큰 소가 서 있을 경우 그 소의 앞에 있는 소들의 머리 모양을 볼 수 없다.

다음 예제를 고려해보자: ()의 숫자는 키를 나타낸다.
1번 소는 2,3,4번소의 머리 모양을 볼 수 있다.
2번 소는 어떤 소의 머리 모양도 볼 수 없다.
3번 소는 4번 소의 머리 모양을 볼 수 있다.
4번 소는 어떤 소의 머리 모양도 볼 수 없다.
5번 소는 6번 소의 머리 모양을 볼 수 있다.
6번 소는 모든 소들의 머리 모양을 볼 수 없다!
i번 소들이 볼 수 있는 머리 모양의 수를 Ci 이라고 할 때, C1부터 CN 까지의 합을 출력하는 프로그램을 작성하라. 위의 예제의 답은 3+0+1+0+1+0=5가 된다.

입력 설명


입력은 두 줄로 이뤄지며 입력의 첫 번째 줄에는 N 이 입력된다.

그리고 그 다음 줄에는 N 개의 숫자가 주어지며, 해당 줄의 i번째 숫자는 hi를 뜻한다.

출력 설명


C1 부터 CN 까지의 합을 한 줄에 하나씩 출력한다.

입력 예시


6
5
2
4
2
6
1

출력 예시


5

#include <stdio.h>
#define MAXN ((int)8e4)
int N;
int H[MAXN + 10];
 
//FA stack
int stk[MAXN+10];
int sp;
void push(int n) { stk[++sp] = n; }
void pop(void) { sp--; }
int top(void) { return stk[sp]; }
int empty(void) { return sp==0; }
int size(void) { return sp; }
 
long long Solve(){
    long long cnt = 0;
 
    sp = 0;
 
    for (int i=0; i<N; i++){
        while(!empty() && (top() <= H[i])) {
            pop();
        }
        cnt += size();
        push(H[i]);
    }
    return cnt;
}
 
long long SolveN2(){//시간초과 발생
    long long cnt = 0;
    for (int i=0; i<N; i++){
        for (int j=i+1; j<N; j++){
            if (H[i] > H[j]) cnt++;
            else break;
        }
    }
    return cnt;
}
 
void InputData(void){
    scanf("%d", &N);
    for (int i=0; i<N; i++){
        scanf("%d", &H[i]);
    }
}
 
int main(void){
    long long ans = -1;
    InputData();//입력
 
    //ans = SolveN2();//시간초과 발생
    ans = Solve();
 
    printf("%lld\n", ans);//출력
    return 0;
}
profile
ocho

0개의 댓글