본문 바로가기
  • 초부득3 - 어제보다 나은 내일을 위해
  • 꿈이 현실이 되는 날까지
sw사관학교 정글 2기/02 이분탐색, 분할정복, 스택, 큐, 우선순위 큐

[우선순위큐]백준 13334번 철로 with Python3 ★

by 금의야행 2021. 8. 17.

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

 

13334번: 철로

입력은 표준입력을 사용한다. 첫 번째 줄에 사람 수를 나타내는 양의 정수 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 n개의 각 줄에 정수 쌍 (hi, oi)가 주어진다. 여기서 hi와 oi는 −100,000,000이상, 100,000,0

www.acmicpc.net

 

문제

정답 풀이

import sys
import heapq

n = int(sys.stdin.readline())
road_info = []
for _ in range(n):
    road = list(map(int, sys.stdin.readline().split()))
    road_info.append(road)

d = int(sys.stdin.readline())
roads = []

for road in road_info:
    house, office = road
    if abs(house - office) <= d:
        road = sorted(road) #큰 원소를 뒤로 보내준걸 roads에 넣어준다
        roads.append(road)
roads.sort(key=lambda x:x[1]) #그리고 큰원소[1]를 기준으로 sort

answer = 0
heap = []

#철로의 시작점을 가장 작은 것부터 순회하면서 차례대로 힙에 넣어준다.
for road in roads:
    if not heap:
        heapq.heappush(heap, road)
    else:
        while heap[0][0] < road[1] - d:
            heapq.heappop(heap) 
#힙의 최소값이 철로의 끝점 road[1]-d에 있는지 확인하고 없으면 pop!
            if not heap: 
                break
        heapq.heappush(heap, road)

    answer = max(answer, len(heap)) 
#이렇게 answer에 최대 값만 넣어준다.

print(answer)

출처:https://velog.io/@piopiop/%EB%B0%B1%EC%A4%80-13334-%EC%B2%A0%EB%A1%9C%ED%8C%8C%EC%9D%B4%EC%8D%AC

 

해석

정답을 생각보다 빠르게 봐버렸다. 이번에는 적절한 조언이 없었기에 어떤 방향으로 구현을 해가야하는지 감이 안잡혔다.

 

기본적으로 우선순위 큐, 혹은 heap 관련은 어떤 식으로 써먹어야할지 쉽게 생각나지가 않는다. 간단한듯 어려운 개념인것같다.

 

코드 자체는 단순한 편이다.

정렬된 좌표들을 왼쪽에서부터 훑어 올라가며 각 경우의 오른쪽 끝점에서 왼쪽으로 d길이의 철로를 만들었을떄 포함되는 집-오피스 들을 계속해서 answer 값에 넣기 위해 이전 값과 지금 값을 max로 비교해 결국 가장 큰 값이 모든 좌표를 탐색했을때 남아있는 식이다. 

댓글