본문 바로가기

알고리즘/Baekjoon

스위핑. [2170]

[1. 문제 설명]
선을 여러번 그었을 때, 그어진 선의 총길이를 구한다.

중복되어 그어진 구간은 한번만 계산해야 한다.


[2. 풀이 접근]

단순한 풀이로는 절대 시간내 해결 할 수 없다.

겹치는 구간등을 확인해야 할 때, 그 범위가 너무 넓기 때문이다.

(문제 입력 상 구간의 최대 길이는 20억)

 

그림을 좀 그리다보면 풀이에 대한 실마리가 조금 잡힌다.

 

// 여기에 그림이 필요..

 

즉, 모든 구간을 X 를 기준으로 정렬 하면,

순차적으로 탐색하다보면

X 를 시작으로 하여 선을 그었을 때 겹쳐지는 최대 구간을 알 수 있다.

=> 자신보다 뒤에오는 구간의 시작 점은 자신보다 앞에 위치 할 수 없다.

=> 지금까지 업데이트 한 구간 내에 있거나, 그 구간을 좀 더 확장시키거나, ...

 

여기서 중요한 점은

새로운 구간이 지금까지 업데이트 한 구간과 겹치는 구간이 존재하지 않을 때 이다.

=> 구간의 시작 점이 현재 까지의 최대 구간보다 뒤에 오는 경우이다.

 

이때는, 기존의 최대 구간의 길이를 더하고,

업데이트 할 구간을 현재 구간으로 갱신해야 한다.

 

전체 시간복잡도는 정렬에 의해 지배 되므로

O(NlogN) 이다.


[3. 코드]

 

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

스위핑/구간 트리. [5419]  (0) 2022.11.07
스위핑. [2836]  (0) 2022.11.05
구간 트리. [1168]  (0) 2022.11.03
구간 트리. [12899]  (0) 2022.11.02
구간 트리. [16975]  (0) 2022.11.01