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;
}
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 |