접근 🍁
쭉~ 입력을 받은 후에 정렬을 했다. 정렬을 하는 게 매우 중요하다..!!
start와 end는, 다른 선들과 겹치지 않는 선은 계산을 끝내고, (다른 선들과 겹칠 가능성을 가진) 당시에 가장 긴 선을 의미한다.
맨 처음 시작점, 도착점을 각각 start, end에 대입했다. 그 다음부터 각각의 시작점, 도착점과 start, end를 비교해 보면 아래 그림의 세 가지 경우 중 하나가 된다. (정렬을 했으니까 항상 그 시점의 시작점보다 start가 작거나 같을 것이다. 그래서 아래 세 가지 경우만 있다.)
1) 두 선이 겹치고, 그 때 꺼낸 도착점이 end보다 뒤에 있는 경우.
그러면 start는 그대로 두고, end는 그때 꺼낸 도착점으로 업데이트한다.
2) 두 선이 겹치고, 그 때 꺼낸 도착점이 end보다 앞에 있는 경우.
start, end 둘 다 그대로 둔다.
3) 두 선이 겹치지 않는 경우.
이제 start, end와 겹치는 선은 없으므로, 그 길이를 ans에 더한다. 그리고 그때 꺼낸 시작점과 도착점으로 start, end를 업데이트한다.
코드 👩💻
import sys
input = sys.stdin.readline
N = int(input())
origin_lines = list(tuple(map(int, input().split())) for _ in range(N))
origin_lines.sort() # 정렬
# 맨 처음 꺼 기준으로
start = origin_lines[0][0]
end = origin_lines[0][1]
ans = 0
for k in range(1, N): # 나머지 선들 보자
now_start, now_end = origin_lines[k]
# 겹치는 경우 => 시작점은 무조건 원래 있던 게 더 앞섬. 도착점은 비교해서 정하기.
if end > now_start:
end = max(end, now_end)
# 안 겹치는 경우
else:
# 기존 것을 ans에 더하기
ans += (end - start)
# 새로운 걸로 업데이트
start, end = now_start, now_end
ans += (end - start)
print(ans)
728x90
'즐거운 PS 👩💻🥰' 카테고리의 다른 글
[백준-파이썬] 16940 : BFS 스페셜 저지 (0) | 2021.10.28 |
---|---|
[백준-파이썬] 1149 : RGB 거리 (0) | 2021.10.27 |
[백준-파이썬] 22234: 가희와 은행 (0) | 2021.10.26 |
[백준-파이썬] 20159: 동작 그만. 밑장 빼기냐. (0) | 2021.10.23 |
[백준-파이썬] 21776: 가희와 읽기 쓰기 놀이 (0) | 2021.10.20 |