[백준 c++] 2170 선 긋기

jw·2022년 11월 14일
0

백준

목록 보기
80/141
post-thumbnail

문제

https://www.acmicpc.net/problem/2170
도화지에 선을 그으려고 한다. 선분끼리 겹쳐서 그린 곳은 한번만 계산한다고 할 때 그려진 선들의 총 길이를 구하는 문제다.

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

풀이

선분들을 pair로 입력받고 오름차순 정렬을 했다.
선분이 겹치는 경우를 고려하면 3가지 경우의 수가 있다.
계산할 선분의 시작을 s 끝을 e로 둔다.

if(v[i].second >= v[i+1].first && v[i].second <= v[i+1].second)
{
	s = v[i].first;
    e = v[i+1].second;
 }
	

v[i].second > v[i+1].second
{
	s = v[i].first;
	e = v[i].second;
}

v[i].second < v[i+1].first
{
	res += e - s;
	s = v[i+1].first;
	e = v[i+1].second;
}

코드

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n, s, e, res;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> n;
    vector<pair<int, int>> v(n);
    for (int i = 0; i < n; i++)
        cin >> v[i].first >> v[i].second;

    sort(v.begin(), v.end());
    s = v[0].first, e = v[0].second;
    for (int i = 1; i < n; i++)
    {
        if (e < v[i].first)
        {
            res += (e - s);
            s = v[i].first, e = v[i].second;
        }
        else if (e >= v[i].first && e <= v[i].second)
            e = v[i].second;
    }
    res += (e - s);
    cout << res << "\n";
}
profile
다시태어나고싶어요

0개의 댓글