알고리즘&자료구조/문제

[BOJ/3015] 오아시스 재결합 (C++)

Nakuri 2023. 11. 14. 19:26
728x90

개요

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

 

3015번: 오아시스 재결합

첫째 줄에 줄에서 기다리고 있는 사람의 수 N이 주어진다. (1 ≤ N ≤ 500,000) 둘째 줄부터 N개의 줄에는 각 사람의 키가 나노미터 단위로 주어진다. 모든 사람의 키는 231 나노미터 보다 작다. 사람

www.acmicpc.net

P5  자력솔 !

본문

힌트

  1. 스택을 활용
  2. 같은 키가 연속으로 push되는 경우를 고려

풀이

더보기
  • 스택 자료구조를 활용하여 입력을 받음과 동시에 top과 비교하여 처리
    (선행 문제 : BOJ 2493번 탑)
  • top이 더 클 경우 : result += (pop한 개수 + 1)개 후 push(키, 1(연속 1회를 의미))
  • top과 같을 경우 : result += (pop한 개수 + 연속된 횟수) 후 push(키, 연속된 횟수)
  • top이 더 작을 경우 : pop한 개수 += 1 후 pop()

코드

더보기
#include<bits/stdc++.h>
using namespace std;
using ll = long long;

stack <pair<ll, int>> s;
ll result;
ll sumNum;
int main(){
	cin.tie(0)->sync_with_stdio(0);

	int n;
	cin >> n;

	ll h;
	for(int i=0; i<n; i++){
		sumNum = 0;
		cin >> h;
		while(true)
		{
			if(s.empty())
			{
				result += sumNum;
				s.push({h, 1});
				break;
			}
			else if(s.top().first > h)
			{
				result += sumNum + 1;
				s.push({h, 2});
				break;
			}
			else if(s.top().first == h)
			{
				result += sumNum + s.top().second;
				s.push({h, s.top().second + 1});
				break;
			}
			else
			{
				sumNum++;
				s.pop();
			}
		}
	}
	cout << result;
}