본문 바로가기

Coding Test/BOJ

[백준/Python] 2170 선 긋기

문제 링크

 

2170번: 선 긋기

첫째 줄에 선을 그은 횟수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 다음 N개의 줄에는 선을 그을 때 선택한 두 점의 위치 x, y (-1,000,000,000 ≤ x < y ≤ 1,000,000,000)가 주어진다.

www.acmicpc.net

 

문제 풀이

  • 먼저, 입력 받은 리스트를 시작점(x[0])에 대해서 오름차순 정렬하고, 끝점(x[1])에 대해서 오름차순 정렬을 한다.
  • 처음의 시작점과 끝점은 각각 리스트의 첫 번째가 되는데, 이 때, 총 길이의 값을 끝점에서 시작점을 뺀 값으로 저장한다.
  • 이후 인접한 두 선분은 총 6가지의 케이스가 나오게 되는데, 각 2가지의 케이스씩 묶어서 생각할 수 있다. 첫 번째는 선분 l1의 끝점이 선분 l2의 시작점보다 큰 경우이고, 두 번째는 선분 l1의 끝점보다 선분 l2의 시작점이 같거나 큰 경우이다. 마지막은 선분l1의 끝점이 선분 l2의 끝점보다 큰 경우이다.
  • 마지막 케이스는 이미 이전에 선분의 길이를 더해주었기 때문에 따로 더하면 안된다는 점이다.

 

전체 코드

import sys

n = int(sys.stdin.readline())
l = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
l.sort(key=lambda x:(x[0], x[1]))

start = l[0][0]
end = l[0][1]
res = end - start
for i in range(1, n):
    if l[i][0] < end < l[i][1]:
        start = end
        end = l[i][1]
        res += (end - start)
    if start <= l[i][0] and end <= l[i][1]:
        start = end
    if end <= l[i][0]:
        start = l[i][0]
        end = l[i][1]
        res += (end - start)

print(res)
반응형

'Coding Test > BOJ' 카테고리의 다른 글

[백준/Python] 2564 경비원  (0) 2024.02.19
[백준/Python] 2343 기타 레슨  (2) 2024.02.17
[백준/Python] 10026 적록색약  (0) 2024.02.15
[백준/Python] 12904 A와 B  (2) 2024.02.14
[백준/Python] 2565 전깃줄  (2) 2024.02.13