Algorithm/Swifting

[백준] 2170번 : 선 긋기 (파이썬)

_은선_ 2024. 2. 18. 00:07
728x90
SMALL

정렬 + 스위핑 문제

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
n = int(sys.stdin.readline())
line = []

for _ in range(n):
    start, end = map(int, sys.stdin.readline().split())
    line.append((start, end))

line.sort()

last = -sys.maxsize
answer = 0

for start, end in line:
    if last > start:
        if last < end:
            answer += (end - last)
            last = end
    else:
        answer += (end - start)
        last = end

print(answer)

 

👩🏻‍💻 위의 코드

나올 수 있는 경우의 수 : 총 3가지

⓵ 기존의 경우의 수와 완전히 겹치는 경우

⓶ 기존의 경우의 수와 겹치기도, 안겹치기도 하는 경우

⓷ 기존의 경우의 수와 완전히 안겹치는 경우

 

+ 우리는 line 배열을 첫번째 값인 start 기준으로 정렬해서 사용(같다면 두번째 값인 end 기준으로 정렬)하기 때문에 다음과 같은 경우는 고려할 필요가 없다.

  • 에서 2~3이 아닌 0~3인 경우 -> 이 경우엔 0~3인 경우가 for문을 가장 처음으로 돌 것.
  • 즉, 우리는 항상 값을 정렬해서 사용하기 때문에 for문을 돌며 현재 end값이 가장 큰 경우에만 별도의 변수로 저장해주면 된다.

 

 

 

728x90
LIST