문제링크 : https://www.acmicpc.net/problem/2170
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N, length = 0, S, E;
cin >> N;
vector<pii> xy;
for(int i=0; i<N; i++)
{
int x, y;
cin >> x >> y;
xy.push_back({x,y});
}
sort(xy.begin(), xy.end());
S = xy[0].first;
E = xy[0].second;
for(int i=1; i<N; i++)
{
if(E < xy[i].first) //새 선분
{
length += (E - S); //그전까지 그은 선분 정리
S = xy[i].first;
}
if(E < xy[i].second) //선분 확장
{
E = xy[i].second;
}
}
length += (E - S); //마지막 선분 정리
cout << length;
return 0;
}
스위핑 알고리즘의 기본문제다.
스위핑 알고리즘이 뭔지 몰라도 푸는데에는 지장이 없을 것 같다.
뒤에 오는 선분의 End가 기존 End보다 크다면 End를 갱신하여 선분의 길이를 늘리고,
뒤에 오는 선분의 Start가 기존 End보다 크다면 아에 겹치지 않으므로 Start를 갱신하여 새 선분을 만든다.
이때 기존까지의 선분 길이를 저장한다.
뒤에 오는 선분이 기존 선분 길이 안에 완전히 겹치는 경우는 선분의 길이가 변하지 않으므로 갱신할 값이 없다.
'백준 > 골드' 카테고리의 다른 글
[백준 15684번] 사다리 조작 (C++) (0) | 2023.05.06 |
---|---|
[백준 2668번] 숫자고르기 (C++) (0) | 2023.05.03 |
[백준 15685번] 드래곤 커브 (C++) (0) | 2023.04.29 |
[백준 17609번] 회문 (C++) (0) | 2023.04.27 |
[백준 13398번] 연속합 2 (C++) (0) | 2023.04.25 |