Algorithm/Baekjoon

[BOJ 1863] 스카이라인 쉬운거

sun_young 2024. 4. 7. 16:30

📃 문제

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

 

1863번: 스카이라인 쉬운거

첫째 줄에 n이 주어진다. (1 ≤ n ≤ 50,000) 다음 n개의 줄에는 왼쪽부터 스카이라인을 보아 갈 때 스카이라인의 고도가 바뀌는 지점의 좌표 x와 y가 주어진다. (1 ≤ x ≤ 1,000,000. 0 ≤ y ≤ 500,000) 첫

www.acmicpc.net


💻 코드

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

int N;
vector<int> v;
stack<int> s;
int cnt = 0;

int main() {
	cin >> N;

	int x, y; 
	for (int i = 0; i < N; i++) {
		cin >> x >> y;
		v.push_back(y);
	}
	v.push_back(0);

	for (int i = 0; i < v.size(); i++) {
		while (!s.empty() && s.top() >= v[i]) {
			if(s.top() > v[i])cnt++;
			s.pop();
		}
		s.push(v[i]);
	}
	cout << cnt << '\n';
}

 

메모리 및 시간


💡 풀이

- vector<int> v; // 좌표의 y값 저장

- stack<int> s; // 스카이라인 고도 오름차순으로 저장

 

 

1. 마지막 건물까지 확인하기 위해 입력 받은 y좌표 저장 후 0값을 마지막에 저장

    v.push_back(0);

 

2. 입력받은 y 좌표 만큼 (vector v의 크기) 반복

 

3. stack이 비어있지 않다면

     3-1. stack.top()이 현재 y좌표(v[i])보다 크거나 같으면 stack.pop()

     3-2. stack.top()이 현재 y좌표(v[i])보다 크면 건물 하나가 끝난 것이기 때문에 cnt(건물 개수)를 증가

     3-3. stack.top()보다 현재 y좌표(v[i])가 작으면 현재 y좌표를 stack에 push

     → stack에 오름차순으로 y좌표 값을 저장