문제 링크입니다: https://www.acmicpc.net/problem/2170
2170번: 선 긋기
첫째 줄에 선을 그은 횟수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 다음 N개의 줄에는 선을 그을 때 선택한 두 점의 위치 x, y (-1,000,000,000 ≤ x < y ≤ 1,000,000,000)가 주어진다.
www.acmicpc.net
x와 y 값이 최대 10억이기 때문에 boolean 배열을 선언한 뒤 마킹하는 식으로 풀 수 없는 문제였습니다.
이에 따라 {x, y} 쌍을 저장하는 벡터를 선언하고 오름차순으로 정렬한 뒤 라인 스위핑 기법으로 푸는 문제였습니다.
- 현재 구간의 y보다 다음 구간의 x가 더 클 경우 현재 [x, y) 길이를 더함
- 현재 구간의 y가 다음 구간의 x와 y 사이에 있을 경우 중복 카운팅을 피하기 위해 현재 구간의 y를 다음 구간의 y로 업데이트
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
#include <algorithm> | |
using namespace std; | |
int main(void) | |
{ | |
ios_base::sync_with_stdio(0); | |
cin.tie(0); | |
int N; | |
cin >> N; | |
vector<pair<int, int>> v; | |
for (int i = 0; i < N; i++) | |
{ | |
int x, y; | |
cin >> x >> y; | |
v.push_back({ x, y }); | |
} | |
sort(v.begin(), v.end()); | |
int left = v[0].first; | |
int right = v[0].second; | |
int result = 0; | |
for (int i = 1; i < N; i++) | |
{ | |
if (right < v[i].first) | |
{ | |
result += (right - left); | |
left = v[i].first; | |
right = v[i].second; | |
} | |
else if (v[i].first <= right && right <= v[i].second) | |
{ | |
right = v[i].second; | |
} | |
} | |
result += (right - left); | |
cout << result << "\n"; | |
return 0; | |
} |

개발환경:Visual Studio 2022
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
백준 14469번 소가 길을 건너간 이유 3 (0) | 2024.04.08 |
---|---|
백준 2109번 순회강연 (0) | 2024.04.06 |
백준 14729번 칠무해 (0) | 2024.04.03 |
백준 15926번 현욱은 괄호왕이야!! (1) | 2024.03.31 |
백준 15353번 큰 수 A+B (2) (0) | 2024.03.31 |