위키득계정 ↗
기술

선분 합집합의 길이

선분 합집합의 길이기술
영어
Length of the union of segments
대상
한 직선 위의 여러 선분
중복 처리
겹치는 부분은 한 번만 포함
대표 계산량
끝점 정렬을 포함해 O(n log n)
선분 합집합의 길이는 하나의 직선 위에 놓인 여러 선분이 덮는 부분의 전체 길이다. 겹치는 부분은 한 번만 세므로 각 선분의 길이를 단순히 더한 값과 다를 수 있다. 끝점을 정렬해 덮인 구간을 누적하면 O(n log n)에 계산할 수 있다.

겹친 길이는 한 번만

선분 [1,5]와 [3,8]의 길이는 각각 4와 5지만 합집합은 [1,8]이므로 전체 길이는 7이다. 두 길이를 더한 9에는 겹친 [3,5]의 길이가 두 번 포함되어 있다. 반면 떨어진 선분 사이의 빈 부분은 전체 길이에 포함하지 않는다.

끝점을 사건으로 정렬

각 선분의 왼쪽 끝과 오른쪽 끝을 모아 좌표 순서로 정렬한다. 왼쪽 끝을 지나면 현재 덮고 있는 선분 수를 늘리고 오른쪽 끝을 지나면 줄인다. 서로 이웃한 두 끝점 사이에서는 덮는 선분 수가 변하지 않으므로 그 구간의 포함 여부를 한 번에 판단할 수 있다.

길이를 더하는 시점

현재 끝점까지의 길이를 더할 때는 이전 끝점을 처리한 뒤의 덮임 수를 사용한다. 그 수가 양수이면 두 좌표의 차이를 답에 더하고, 이어서 현재 끝점의 사건을 반영한다. 같은 좌표의 사건을 함께 처리하면 길이가 0인 구간 때문에 중복 길이가 생기는 일을 피할 수 있다.

길이와 점의 개수

끝점 포함 여부는 실수 직선에서 유한한 선분들의 전체 길이에 영향을 주지 않는다. 그러나 정수 좌표의 점을 몇 개 덮는지 세는 문제는 다르다. 예를 들어 [1,3]의 길이는 2지만 그 안의 정수는 1, 2, 3의 세 개다. 두 문제의 공식을 혼용하면 안 된다.

관련 문서

선분 / 합집합 / 구간 / 정렬 / 시간 복잡도 / 포함배제 원리