백준/증가수열 & 투포인터

[백준 2170번 / C++] 선 긋기

배발자 2022. 2. 9.
반응형

투포인터를 활용한 문제이다. 

 

1. pair 구조를 가진 벡터를 오름차순으로 정렬하자. 

2. 첫번째 벡터 쌍의 원소 값 두개(X, Y)를 start 와 end 라는 변수에 각각 저장하자. 

3. 벡터 사이즈만큼 반복문을 돌린다.

 

이때, 벡터의 첫번째 원소의 값(X)이 end 변수의 값보다 작거나 같으면 선이 이어진다는 의미이므로, 벡터의 두번째 원소의 값과 end 변수에 저장된 값 중 큰 값으로 end 변수를 갱신해나간다. 

만약, 벡터의 첫번째 원소의 값(X)이 end 변수의 값보다 크다면 선이 겹치지 않았다는 의미이므로 start, end 변수에는 해당 벡터의 원소의 값들로 새로 저장해준다. 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
	ios::sync_with_stdio(0); 
	cin.tie(0);  
	int n; cin >> n; 
	vector <pair<int, int>> v; 
	for (int i = 0; i < n; i++) {
		int a, b; 
		cin >> a >> b; 
		v.push_back({ a,b }); 
	}
	sort(v.begin(), v.end()); 	
	int start, end, sum = 0; 
	start = v[0].first; 
	end = v[0].second; 
	for (int i = 1; i < v.size(); i++) {
		if (end >= v[i].first)end = max(end, v[i].second); 		
		else {	
			sum += (end - start); 
			start = v[i].first; 
			end = v[i].second; 
		}
	}
	sum += (end - start); 
	cout << sum; 
}
 

2170번: 선 긋기

첫째 줄에 선을 그은 횟수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 다음 N개의 줄에는 선을 그을 때 선택한 두 점의 위치 x, y(-1,000,000,000 ≤ x < y ≤ 1,000,000,000)가 주어진다.

www.acmicpc.net

반응형

댓글