알고리즘

라인 스위핑

Themion 2022. 1. 23. 15:42

라인 스위핑은 수 직선 위의 여러 선분이 겹쳐있을 때, 이 선분을 모두 겹친 경우의 길이를 측정하는 알고리즘이다. 선분을 입력받을 때마다 그 길이를 측정해 합을 구한다면 선분이 겹쳤을 때 에러가 발생하므로 불가능하고, 선분을 입력받을 때마다 배열에 선분을 그린 뒤 길이를 센다면 선분의 길이 n에 대해 각 선분을 표시할 때의 시간 복잡도가 O(n)이므로 선분이 매우 길거나 선분의 개수가 매우 많다면 시간을 너무 오래 소모하게 된다.

{int crd, int stat}꼴 구조체의 배열 arr에 선분을 입력받을 때마다 {시작 좌표, 1}과 {끝 좌표, -1}을 push한 뒤 좌표가 증가하는 순으로, 좌표가 같다면 시작 좌표가 앞에 오게끔 정렬한다. 이후 arr을 0번째 인덱스부터 순차적으로 탐색하며 stat 값을 모두 더한다면, 그 값이 0이 되는 순간 수 직선에서 겹친 선분이 끝나므로, 이 때의 arr의 인덱스를 k라고 한다면 수 직선에 나타난 합쳐진 선분의 길이는 arr[k].crd - arr[0].crd가 된다. 이 과정을 k + 1부터 arr의 모든 성분에 대해 반복하게 되면 수 직선에 나타난 각 합쳐진 선분에 대해 길이를 구할 수 있다.

for (int i = 0; i < N; i++) {
cin >> a >> b;
    arr[2 * i] = {a, 1};
    arr[2 * i + 1] = {b, -1};
}

sort(arr, arr + (N *= 2));

for (int i = 0; i < N; i++) {
    if (!line) start = arr[i]._crd;
    line += arr[i]._stat;
    if (!line) ans += arr[i]._crd - start;
}

https://www.acmicpc.net/problem/15922

 

15922번: 아우으 우아으이야!!

N개의 선분을 모두 그렸을 때, 수직선 위에 그어진 선분 길이의 총합을 출력한다아아어으잉에애야우아으아이아야아아아아아아이야!!!

www.acmicpc.net

https://www.acmicpc.net/problem/19598

 

19598번: 최소 회의실 개수

서준이는 아빠로부터 N개의 회의를 모두 진행할 수 있는 최소 회의실 개수를 구하라는 미션을 받았다. 각 회의는 시작 시간과 끝나는 시간이 주어지고 한 회의실에서 동시에 두 개 이상의 회의

www.acmicpc.net

'알고리즘' 카테고리의 다른 글

트라이  (0) 2022.01.23
누적 합  (0) 2022.01.23
큰 수의 덧셈  (0) 2022.01.23
가장 긴 증가하는 부분 수열  (0) 2022.01.22
비트마스킹  (0) 2022.01.22