본문 바로가기
Algorithm/백준

[Python] 백준 2170번 - 선 긋기(골드 5)

by 애기 개발자 2024. 6. 1.
반응형
혼자 힘으로 풀었는가? O

알고리즘 분류
 - 정렬
 - 스위핑

 

https://www.acmicpc.net/problem/2170

 

문제

매우 큰 도화지에 자를 대고 선을 그으려고 한다. 선을 그을 때에는 자의 한 점에서 다른 한 점까지 긋게 된다. 선을 그을 때에는 이미 선이 있는 위치에 겹쳐서 그릴 수도 있는데, 여러 번 그은 곳과 한 번 그은 곳의 차이를 구별할 수 없다고 하자.

이와 같은 식으로 선을 그었을 때, 그려진 선(들)의 총 길이를 구하는 프로그램을 작성하시오. 선이 여러 번 그려진 곳은 한 번씩만 계산한다.

입력

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

출력

첫째 줄에 그은 선의 총 길이를 출력한다.

 


 

문제 설명을 보고 도화지라고 하길래 좌표평면으로 구하는 줄 알았는데

 

자세히 읽어보니 그냥 선 위에서 구하는 문제였다.

 

시작점과 끝점을 비교하여 총 길이를 구하는 문제다.

 

스위핑 알고리즘은 잘 모르겠고 단순하게 풀어도 풀리는 문제였다.

 

파이썬이라 쉬운걸지도

 

import sys
input = sys.stdin.readline

n = int(input())
data = []
for i in range(n):
    data.append(list(map(int, input().split())))
    
data.sort()

start = data[0][0]
end = data[0][1]
result = 0

for i in range(1, n):
    if end >= data[i][0]:
        end = max(end, data[i][1])
    else:
        result += end-start
        start = data[i][0]
        end = data[i][1]
        
print(result+(end-start))

 

3%에서 틀릴 경우 반례

 

3
1 6
2 3
4 5

정답 : 5

 

반응형

댓글