정렬하고 쭉 ~ 한번 보면 되는 스위핑 문제!!
정렬한 후에 (출발지가 앞쪽인 순서, 출발지가 같으면 도착지가 앞쪽일 수록 앞에)
쭉~ 보면서 두 노선씩 비교한다.
a_route는 처음 노선으로 초기화하고 시작하고, b_route는 그 다음 노선부터 끝까지 쭉 본다.
만약 a, b 노선이 겹친다면 합쳐서 새로운 노선으로 만든다! 이때 요금은 더 낮은 쪽을 따른다.
출발점이 더 나중에어도, 도착점이 더 이른 노선이 있을 수도 있다. 노란 색 노선, 빨간 색 노선을 비교할 때는.. 일단 겹치니까 a_route를 업데이트하는데, 'a_route = (a_route[0], max(a_route[1], b_route[1]), min(a_route[2], b_route[2]))'에서 'max(a_route[1], b_route[1])' 이렇게 해야 한다!
처음 풀 때는 그냥 'b_route[1]'로 해서 틀렸다.!
겹치지 않으면, 그때까지 합친 노선(a_route)을 새로운 result_route에 추가한다.
그리고 a_route를 이제부터 볼 새로운 노선으로 업데이트 한다.
for문 끝까지 돈 후에, 반영 안된 노선이 있을 수 있으니 반영해준다.
그리고 출력하면 끝!!
import sys
input = sys.stdin.readline
MIIS = lambda: map(int, input().split())
N = int(input())
bus_route = []
for _ in range(N):
S, E, C = MIIS()
bus_route.append((S, E, C))
# 정렬
bus_route.sort()
result_route = []
a_route = bus_route[0] # 처음 노선
for i in range(1, N):
# 두 노선을 보면서
b_route = bus_route[i]
# 겹치면 합쳐서 새로운 노선으로 만들기
if a_route[1] >= b_route[0]:
a_route = (a_route[0], max(a_route[1], b_route[1]), min(a_route[2], b_route[2]))
else: # 안 겹치면 그때까지 합친 노선을 새롭게 result_route에 추가하고, 새로운 노선 만들기
result_route.append(a_route)
a_route = bus_route[i]
# 반영 안한 노선 있으면 반영
if a_route not in result_route:
result_route.append(a_route)
print(len(result_route))
for route in result_route:
print(*route)
728x90
'즐거운 PS 👩💻🥰' 카테고리의 다른 글
[백준-파이썬] 9844: Gecko (0) | 2021.12.05 |
---|---|
[백준-파이썬] 23739: 벼락치기 (0) | 2021.12.03 |
[백준-파이썬] 2343: 기타 레슨 (0) | 2021.11.20 |
[백준-파이썬] 15686: 치킨 배달 (0) | 2021.11.17 |
[백준-파이썬] 1897: 토달기 (0) | 2021.11.12 |