본문 바로가기

PS - 알고리즘

8155 - Postering

step 1

더보기
더보기

가로 폭이 얼마든 상관 없습니다. 전부 1로 생각합니다.

만약 모든 빌딩의 높이가 다르다면 답은 $N$입니다. 결국 높이가 같은 것들을 한번에 처리하는 것이 중요합니다.

step 2

더보기
더보기

만약 어떤 두 건물의 높이가 같고 그 사이에 있는 모든 건물이 이 건물의 높이보다 크다면 두 건물은 하나의 포스터로 처리할 수 있습니다. 이 과정은 스택을 이용해서 처리할 수 있습니다. 지금 보는 건물이 현재 스택의 top보다 크면 넣고 작으면 스택을 pop해줍니다. 만약 스택의 top과 지금 건물의 높이가 같다면 이 두 건물 사이 모든 건물이 두 건물보다 높다는 뜻입니다. 이러한 건물의 개수를 세고 $N$에서 빼주면 됩니다.

코드

더보기
더보기
#include <stdio.h>
#include <vector>
#include <algorithm>
#include<math.h>
#include<bitset>
#include<queue>
#include<stack>
using namespace std;
stack<int> s;
int main(){
    int n, i,cnt=0;
    scanf("%d", &n);
    for (i = 1; i <= n; i++) {
        int x,y;
        scanf("%d %d", &y, &x);
        while (1) {
            if (s.size() == 0) { s.push(x); cnt++; break; }
            if (s.top() < x) { s.push(x); cnt++; break; }
            else if (s.top() > x) s.pop();
            else { s.pop(); cnt--; }
        }
    }
    printf("%d", cnt);
    return 0;
}

'PS - 알고리즘' 카테고리의 다른 글

6549 - 히스토그램에서 가장 큰 직사각형  (0) 2024.05.24
MCMF(min cut max flow)  (0) 2024.05.22
네트워크 플로우  (0) 2024.05.10
백준 30481 - Forward and Backward  (0) 2024.05.06
백준 1118 - 색칠 2  (0) 2024.05.05