BOJ

백준 2304 - 창고 다각형

yanJuicy 2019. 9. 29. 01:12
반응형

문제

 

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

 

2304번: 창고 다각형

첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의 빈 칸을 사이에 두고 주어진다. L과 H는 둘 다 1 이상 1,000 이하이다.

www.acmicpc.net

 

 

풀이

 

가장 긴 막대 기둥을 기준으로 왼쪽과 오른쪽으로 나눈다. 왼쪽 부터 가장 긴 막대 기둥까지 진행하면서 스택의 최대 높이를 갱신하면서 넓이를 더해준다. 마찬가지로 오른쪽에서도 가장 긴 막대 기둥까지 진행하면서 스택의 최대 높이를 갱신하면서 넓이를 더해준다. 

 

 

코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <stack>
 
using namespace std;
 
stack<int> st;
int N;
int arr[1001];
int pos, len;
int first = 1001, last, longest;
int result;
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
 
    cin >> N;
 
    while (N--)
    {
        cin >> pos >> len;
        arr[pos] = len;
        if (last < pos) last = pos;
        if (first > pos) first = pos;
        if (len > arr[longest]) longest = pos;
    }
 
    for (int i=first; i<=longest; i++)
    {
        if (arr[i])
        {
            if (st.empty()) st.push(arr[i]);
            else if(arr[i] > st.top()) st.push(arr[i]);
        }
        result += st.top();
    }
 
    while (!st.empty()) st.pop();
 
    for (int i=last; i>longest; i--)
    {
        if (arr[i])
        {
            if (st.empty()) st.push(arr[i]);
            else if(arr[i] > st.top()) st.push(arr[i]);
        }
        result += st.top();
    }
 
    cout << result;
 
    return 0;
}
cs

 

 

반응형

'BOJ' 카테고리의 다른 글

백준 1697 - 숨바꼭질  (0) 2019.10.02
백준 2875 - 대회 or 인턴  (0) 2019.09.30
백준 1541 - 잃어버린 괄호  (0) 2019.09.24
백준 7576 - 토마토  (0) 2019.09.23
백준 10815 - 숫자 카드  (0) 2019.09.22