알고리즘/백준

[백준 2493] 탑 (C++)

겜도리도리 2021. 8. 25. 01:53
반응형

문제

백준 2493

 

2493번: 탑

첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1

www.acmicpc.net

풀이

먼저 탑의 높이와 인덱스를 받는 stack을 선언합니다.

탑의 높이를 입력해주고, 뒤에서 부터 다음 과정을 실행합니다.

1. 스택이 비었을 경우에는 탑의 높이와 인덱스를 스택에 push 합니다.

2. 스택이 비어있지 않을 때는, 스택의 top과 현재 탑의 높이를 비교하여, top이 작다면 레이저가 도달한 것이므로

레이저가 닿는 탑의 위치를 저장하는 배열 receive에 탑의 위치를 저장해준 후, stack을 pop 합니다.

3. 계속해서 top이 작다면 이 작업을 반복합니다.

4. top이 현재 탑의 높이보다 크다면 push 합니다.

소스 코드

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
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
 
int tower[500001];
int receive[500001];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> tower[i];
    }
    //높이, 인덱스
    stack<pair<intint>> st;
    int idx = n;
    for (int i = n; i > 0; i--)
    {
        if (!st.empty())
        {
            while (st.top().first < tower[i])
            {
               receive[st.top().second] = i;
                st.pop();
                if (st.empty())
                    break;
            }
        }
        st.push(make_pair(tower[i], i));
    }
    for (int i = 1; i <= n; i++)
    {
        cout << receive[i] << ' ';
    }
    return 0;
}
cs
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 16236] 아기 상어 (C++)  (0) 2021.08.26
[백준 15681] 트리와 쿼리 (C++)  (0) 2021.08.26
[백준 1068] 트리 (C++)  (0) 2021.08.25
[백준 3020] 개똥벌레 (C++)  (0) 2021.08.24
[백준 17070] 파이프 옮기기 1 (C++)  (0) 2021.08.23