[BOJ] 2170번 선 긋기 - Python

"스위핑"

Posted by Yongmin on October 12, 2021

문제

선 긋기

풀이

스위핑, 훑는 문제이다. 시작점을 오름차순으로 sort하고 난 뒤, 선이 이어지는지 안이어지는지 여부를 따진다.
이어진다는 것은 기존의 끝점보다 시작점이 더 작은 경우가 이어진다. 이 때, 끝점은 기존의 끝점과 새로운 끝점 중에 큰 값이 되게 된다.
이어지지 않는 경우는, 기존의 끝점보다 시작점이 더 큰 경우로, 이 경우는 새롭게 시작점과 끝점을 설정하여 정답을 도출한다.

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
iimport sys
li = []

ans = 0
n = int(input())

for i in range(n):
    start, end = map(int, sys.stdin.readline().split()) # 입력때문에 시간초과 났음
    li.append((start, end))
li.sort()
prevStart, prevEnd = li[0][0], li[0][1]
for i in range(1, n):
    start, end = li[i][0], li[i][1]
    if start <= prevEnd:
        prevEnd = max(prevEnd, end)
    else:
        ans+=prevEnd-prevStart
        prevStart, prevEnd = start, end

ans+=prevEnd-prevStart

print(ans)


# # #