[백준 / BOJ][Python] 2170 - 선 긋기
2023. 3. 8. 02:58ㆍProblem Solving
[백준 / BOJ][Python] 2170 - 선 긋기
https://www.acmicpc.net/problem/2170
2170번: 선 긋기
첫째 줄에 선을 그은 횟수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 다음 N개의 줄에는 선을 그을 때 선택한 두 점의 위치 x, y (-1,000,000,000 ≤ x < y ≤ 1,000,000,000)가 주어진다.
www.acmicpc.net
문제 풀이
기초 수준의 스위핑 문제. 우선 시작점과 끝점을 기준으로 선들을 정렬한다. 이후 기존의 선에 추가하여 덧붙일 수 있다면 붙이고, 기존 선의 끝점보다 새로 긋는 선의 출발점이 뒤에 있다면 이전 선의 길이를 정답에 더하고 새로운 선을 긋는다.
코드
import sys
input = sys.stdin.readline
n = int(input())
line_list = [] #선들의 집합
for _ in range(n):
line_list.append(tuple(map(int, input().split())))
line_list.sort() #시작점, 끝점을 기준으로 오름차순 정렬
ans = 0
s, e = -10 ** 10, -10 ** 10 #현재 선의 시작점, 끝점
for a, b in line_list:
if a > e: #새로 긋는 선의 시작점이 기존 선의 끝점보다 크다면
ans += e - s #기존 선의 길이를 정답에 추가
s, e = a, b #기존의 선을 새로 긋는 선으로 교체
else:
e = max(e, b) #기존 선의 끝점은 max(새로 긋는 선의 끝점, 기존 선의 끝점)
ans += e - s #마지막으로 남아있는 선의 길이 정답에 추가
print(ans)
'Problem Solving' 카테고리의 다른 글
[백준 / BOJ][Python] 23254 - 나는 기말고사형 인간이야 (1) | 2023.03.22 |
---|---|
[백준 / BOJ][Python] 5419 - 북서풍 (0) | 2023.03.16 |
[백준 / BOJ][Python] 1185 - 유럽 여행 (0) | 2023.03.06 |
[백준 / BOJ][Python] 2162 - 선분 그룹 (0) | 2023.03.01 |
[백준 / BOJ][Python] 17387 - 선분 교차 2 (1) | 2023.03.01 |