article thumbnail image
Published 2021. 8. 20. 15:37

문제 설명

문제 링크

http://icpc.me/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좌표 기준으로 오름차순으로 정렬한 후 범위가 겹친다면 범위를 점차 늘려나가고, 겹치지 않을 때 그동안 늘려온 범위의 값을 더하며 새로운 범위를 시작한다.

코드

#include <cstdio>
#include <algorithm>

using namespace std;
using pii = pair<int, int>;

pii arr[1000006];

int main() {
    int n; scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d %d", &arr[i].first, &arr[i].second);
    }
    sort(arr, arr + n);
    int l = -1e9, r = -1e9, ans = 0;
    for (int i = 0; i < n; i++) {
        if (arr[i].first > r) {
            ans += r - l;
            l = arr[i].first;
            r = arr[i].second;
        }
        r = max(r, arr[i].second);
    }
    ans += r - l;
    printf("%d", ans);
}

'Algorithm > BOJ' 카테고리의 다른 글

백준[2836] 수상 택시  (0) 2021.08.25
백준[5419] 북서풍  (0) 2021.08.20
백준[1168] 요세푸스 문제 2  (0) 2021.08.19
백준[12899] 데이터 구조  (0) 2021.08.19
백준[16975] 수열과 쿼리 21  (0) 2021.08.16
복사했습니다!