728x90
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
import heapq
input = sys.stdin.readline
N = int(input())
arr = []
for _ in range(N):
start, end = map(int, input().split())
arr.append((start, end))
arr.sort()
queue = []
heapq.heappush(queue, (arr[0][0], arr[0][1]))
for i in range(1, N):
start, end = arr[i]
new_queue = []
is_added = False
while queue:
p_start, p_end = heapq.heappop(queue)
if p_end >= start:
is_added = True
p_end = max(p_end, end)
heapq.heappush(new_queue, (p_start, p_end))
if not is_added:
heapq.heappush(new_queue, (start, end))
queue = new_queue
ans = 0
for i in range(len(queue)):
ans += queue[i][1] - queue[i][0]
print(ans)
이후 개선
import sys
input = sys.stdin.readline
N = int(input().rstrip())
arr = []
for _ in range(N):
s,e = map(int,input().rstrip().split())
arr.append((s,e))
arr.sort(key=lambda x : (x[0]))
tot = 0
max_check = -int(1e9)
for s,e in arr:
if s > max_check: # 선분 개시
tot += e-s
max_check = e
elif s <= max_check and e > max_check:
tot += (e-max_check)
max_check = e
print(tot)
🎯 피드백 및 개선사항
왜 왜 문제를 풀때에는 저런 아이디어를 떠올리지 못할까요… 😢 알고리즘의 갈길은 너무 머네요 !!
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 13164번 : 행복 유치원 (0) | 2024.02.14 |
---|---|
[백준] 8983번 : 사냥꾼 (0) | 2024.02.14 |
[백준] 2230번 : 수 고르기 (2) | 2024.02.13 |
[백준] 2473번 : 세 용액 (0) | 2024.02.12 |
[백준] 2470번 : 두 용액 (0) | 2024.02.12 |