반응형
# 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 |