본문 바로가기
Algorithm/백준 알고리즘 풀이

[Baekjoon] 1461. 도서관

by newnu 2021. 4. 28.
반응형

# Problem

세준이는 도서관에서 일한다. 도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다. 세준이는 현재 0에 있고, 사람들이 마구 놓은 책도 전부 0에 있다. 각 책들의 원래 위치가 주어질 때, 책을 모두 제자리에 놔둘 때 드는 최소 걸음 수를 계산하는 프로그램을 작성하시오. 세준이는 한 걸음에 좌표 1칸씩 가며, 책의 원래 위치는 정수 좌표이다. 책을 모두 제자리에 놔둔 후에는 다시 0으로 돌아올 필요는 없다. 그리고 세준이는 한 번에 최대 M권의 책을 들 수 있다.

입력

첫째 줄에 책의 개수 N과, 세준이가 한 번에 들 수 있는 책의 개수 M이 주어진다. 둘째 줄에는 책의 위치가 주어진다. N은 10,000보다 작거나 같은 자연수이고, M은 10,000보다 작거나 같다. 책의 위치는 0이 아니며, 그 절댓값이 10,000보다 작거나 같다.

출력

첫째 줄에 정답을 출력한다.

 

# My Answer

n,m = map(int, input().split())
books = list(map(int,input().split()))
books.sort()
b1=[]
b2=[]
for i in range(len(books)):
    if books[i]>=0:
        b1 = books[:i]
        b2 = books[i:]
        break
    else:
        b1 = [abs(i) for i in books]

move=[]
if b1:
    b1 = [abs(i) for i in b1]
    b1.sort(reverse=True)
    for i in range(0,len(b1),m):
        move.append(b1[i])
if b2:
    b2.sort(reverse=True)
    for i in range(0,len(b2),m):
        move.append(b2[i])

move.sort()
print(sum(move)*2-move[-1])

모든 수가 음수일 때, 모든 수가 양수일 때, 양수 음수 섞여있을 때 생각하기

 

# Solution 

import heapq

n, m = map(int, input().split(' '))
array = list(map(int, input().split(' '))) 
positive = []
negative = []

# 가장 거리가 먼 책까지의 거리
largest = max(max(array), - min(array))

# 최대 힙(Max Heap)을 위해 원소를 음수로 구성
for i in array:
    # 책의 위치가 양수인 경우 
    if i > 0:
        heapq.heappush(positive, -i)
    # 책의 위치가 음수인 경우
    else:
        heapq.heappush(negative, i)
        
result = 0

while positive:
    # 한 번에 m개씩 옮길 수 있으므로 m개씩 빼내기 
    result += heapq.heappop(positive)
    for _ in range(m - 1):
    if positive: 
        heapq.heappop(positive)
while negative:
    # 한 번에 m개씩 옮길 수 있으므로 m개씩 빼내기 
    result += heapq.heappop(negative)
    for _ in range(m - 1):
        if negative: 
            heapq.heappop(negative)
# 일반적으로 왕복 거리를 계산하지만, 가장 먼 곳은 편도 거리 계산
print(-result * 2 - largest)

heapq는 최소힙

최대힙으로 만들어주기 위해 음수 저장

거리가 최대인 원소부터 빼줘서 result에 저장하고, 그 후 m-1개는 pop (한번에 m개씩 이동)

반응형

'Algorithm > 백준 알고리즘 풀이' 카테고리의 다른 글

[Baekjoon] 9663. N-Queen  (0) 2021.04.29
[Baekjoon] 1781. 컵라면  (0) 2021.04.28
[Baekjoon] 2212. 센서  (0) 2021.04.28
[Baekjoon] 1092. 배  (0) 2021.04.28
[Baekjoon] 2012. 등수 매기기  (0) 2021.04.27