728x90
반응형
  • 문제

매우 큰 도화지에 자를 대고 선을 그으려고 한다. 선을 그을 때에는 자의 한 점에서 다른 한 점까지 긋게 된다. 선을 그을 때에는 이미 선이 있는 위치에 겹쳐서 그릴 수도 있는데, 여러 번 그은 곳과 한 번 그은 곳의 차이를 구별할 수 없다고 하자.

이와 같은 식으로 선을 그었을 때, 그려진 선(들)의 총 길이를 구하는 프로그램을 작성하시오. 선이 여러 번 그려진 곳은 한 번씩만 계산한다.

  • 입력

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

  • 출력

첫째 줄에 그은 선의 총 길이를 출력한다.

  • 예제 입력
4
1 3
2 5
3 5
6 7
  • 예제 출력
5
  • 접근방식

그냥 단순하게 카운팅 배열로 하려고 했지만 범위가 10억이여서 라인 스위핑으로 해결했다.

범위에서 겹쳐지면 오른쪽 부분만 갱신하고 겹쳐지지 않으면 오른쪽 부분 - 왼쪽 부분을 더하고 둘 다 갱신 시켜준다.

  • 코드
#include <iostream>
#include <algorithm>

using namespace std;

int n, _left, _right, from, to, result;
pair<int, int> Line[1000004];

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> n;

    for (int i = 0; i < n; i++)
    {
        cin >> from >> to;
        Line[i] = { from,to };
    }

    sort(Line, Line + n);

    _left = Line[0].first;
    _right = Line[0].second;

    for (int i = 1; i < n; i++)
    {
        if (_right < Line[i].first) // 겹쳐지지 않으면
        {
            result += (_right - _left);
            _left = Line[i].first;
            _right = Line[i].second;
        }
        else if (Line[i].first <= _right && Line[i].second >= _right) // 겹쳐지면 갱신
        {
            _right = Line[i].second;
        }
    }

    result += _right - _left;
    cout << result;

    return 0;
}
 

2170번: 선 긋기

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

www.acmicpc.net

 

728x90
반응형

'C++ > BOJ' 카테고리의 다른 글

[C++]/백준 2343번 기타 레슨  (1) 2024.03.28
[C++]/백준 2792번 보석상자  (1) 2024.03.27
[C++]/백준 17822번 원판 돌리기  (0) 2024.03.26
[C++]/백준 15683번 감시  (0) 2024.03.26
[C++]/백준 1912번 연속합  (0) 2024.03.26

+ Recent posts