문제 풀이/BOJ 문제 풀이

[BOJ알고리즘, C++]#2493_탑, 스택, 히스토그램 유형

Hardii2 2024. 3. 7. 11:59

 

#1. 문제

 

2493번: 탑

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

www.acmicpc.net

 


 

#2. 풀이

 

1. 스택

 

[자료 구조]#0_선형 자료구조

[자료 구조] #0_선형 자료구조 선형 자료구조에 대해 알아보겠습니다. Overview 개념 스택 큐 원형 큐 덱 배열 벡터 리스트 이중 연결 리스트 #0. 개념 1. 선형 자료구조? [정의] : 선형 자료구조는 데

webddevys.tistory.com

 

스택은 후입 선출 방식으로 동작하는 선형 자료구조로, 지정된 형식의 데이터를 한쪽 방향으로만 삽입하며, 제거 작업은 반대편 한쪽에서만 가능합니다.

 

2. 히스토그램 유형 문제는 스택으로 풀자!

 

  1. 각 송신탑의 높이 값을 차례대로 vector 컨테이너에 저장합니다. 그리고, 빈 스택 하나를 선언합니다.
  2. 높이 값을 저장한 vector 컨테이너를 차례대로 순회합니다. 이때, 스택의 top에 위치한 인덱스에 해당하는 높이 값과 현재 위치의 높이 값을 비교하고, 현재 높이 값이 크다면 현재 스택의 top 값을 pop 해줍니다. 이 과정은 stack이 동나거나, top에 위치한 인덱스에 해당되는 높이 값이 현재 위치의 값보다 클 때까지 반복됩니다.
  3. 마지막으로, stack이 비어있을 경우 현재 위치의 송신탑이 레이저를 발사하면 왼쪽에 위치한 어느 송신탑도 그 레이저를 받을 수 없습니다. 반면, stack이 비어있지 않을 경우, stack의 top에 위치한 인덱스에 해당되는 높이 값이 현재 송신탑의 레이저를 수신 받게됩니다!

 



#3. 코드

 

#include <iostream>
#include <vector>
#include <string>
#include <stack>
using namespace std;

int N;
vector<int> v, ans;
stack<int> s;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> N;

    v.resize(N + 1);
    ans.resize(N+1);
    
    for (int i = 1; i <= N; ++i)
    {
        cin >> v[i];
    }

    for (int i = 1; i <= N; ++i)
    {
        while (!s.empty() && v[i] > v[s.top()])
        {
            s.pop();
        }

        if (s.empty())
            ans[i] = 0;
        else
            ans[i] = s.top();

        s.push(i);
    }

    for (int i = 1; i <= N; ++i)
        cout << ans[i] << ' ';

    return 0;
}