PS

BOJ 2170 - 선긋기

728x90

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

 

입력으로 들어온 시작점, 끝점을 전부 하나의 자료형에 담아둔 뒤,

시작점 기준으로 오름차순 정렬한다.

그 후 정렬된 배열에서

첫번째 원소는 가장 앞에 있는 시작점 이므로, 이 좌표를 기준으로 삼고

다음 좌표와 비교할때, 이전 좌표의 시작점 끝점 사이에 존재하는 선인가? (겹치는 선인가) 판별한다

그리고 겹치는 선이면서 동시에 다음 좌표의 끝점이 더 긴 경우 끝점을 그 값으로 갱신한다.

그렇지 않으면 끊긴선이므로, 별도의 선으로 길이를 계산한다. 

 

 

- c++

#include <algorithm>
#include <iostream>
#include <vector>
 
using namespace std;
 
int N, answer;
vector<pair<intint>> vec;
 
bool comp(pair<intint> p1, pair<intint> p2) {
    return p1.first < p2.first;
}
 
int main() {
    cin.tie(0); ios_base::sync_with_stdio(0);
 
    cin >> N;
    
    for (int i = 0; i < N; ++i) {
        int start, end;
        cin >> start >> end;
        vec.push_back({start, end});
    }
    
    sort(vec.begin(), vec.end(), comp);
    
    int start = vec[0].first, end = vec[0].second;
    for (int i = 1; i < vec.size(); ++i) {
        if (start <= vec[i].first && vec[i].first <= end && end < vec[i].second) {
            end = vec[i].second; 
        } else if (vec[i].first > end) {
            answer += (end - start);
            start = vec[i].first;
            end = vec[i].second;
        }
    }
    
    answer += (end - start);
    cout << answer;
    
    return 0;
}
cs

 

 

 

 

대표적인 스위핑 문제이다.

아래의 사이트 참조

blog.naver.com/kks227/220907708368

 

스위핑 기법(Sweeping Algorithm) (수정: 2019-06-24)

안녕하세요 겁나 오랜만입니다. 종강 기념으로 드디어 새 글을 씁니다. (하지만 아직도 바쁩니다.) 이번에 ...

blog.naver.com

 

728x90

'PS' 카테고리의 다른 글

BOJ 6236 - 용돈 관리  (0) 2021.01.12
BOJ 1761 - 정점들의 거리  (0) 2021.01.11
BOJ 11053 - 가장 긴 증가하는 부분 수열  (0) 2020.12.29
BOJ 11722 - 가장 긴 감소하는 부분 수열  (0) 2020.12.29
BOJ 17144 - 미세먼지 안녕  (0) 2020.12.27