[BOJ] 1461 도서관 (Python3)
문제
세준이는 도서관에서 일한다. 도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다. 세준이는 현재 0에 있고, 사람들이 마구 놓은 책도 전부 0에 있다. 각 책들의 원래 위치가 주어질 때, 책을 모두 제자리에 놔둘 때 드는 최소 걸음 수를 계산하는 프로그램을 작성하시오. 세준이는 한 걸음에 좌표 1칸씩 가며, 책의 원래 위치는 정수 좌표이다. 책을 모두 제자리에 놔둔 후에는 다시 0으로 돌아올 필요는 없다. 그리고 세준이는 한 번에 최대 M권의 책을 들 수 있다.
입력
첫째 줄에 책의 개수 N과, 세준이가 한 번에 들 수 있는 책의 개수 M이 주어진다. 둘째 줄에는 책의 위치가 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 책의 위치는 0이 아니며, 절댓값은 10,000보다 작거나 같은 정수이다.
출력
첫째 줄에 정답을 출력한다.
정답 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
n,m = map(int,input().split())
book = list(map(int, input().split()))
left = []
right = []
for item in book:
if item < 0:
left.append(abs(item))
elif item > 0:
right.append(item)
distance = []
left.sort(reverse = True)
for i in range(len(left)//m):
distance.append(left[m * i])
if len(left) % m > 0:
distance.append(left[(len(left) // m) * m])
right.sort(reverse = True)
for i in range(len(right)//m):
distance.append(right[m * i])
if len(right) % m > 0:
distance.append(right[(len(right) // m) * m])
distance.sort()
result = distance.pop()
result += 2 * sum(distance)
print(result)
문제 풀이
그리디를 이용해서 푸는 문제다.
생각해보면, 책을 들수 있는 권수가 m이면 반드시 m번째는 방문을 해야하므로 동선을 아끼는 방법은 가장 먼곳을 나중에 방문하는 것이다. 따라서 음수와 양수를 나눈 뒤, 음수와 양수의 m번째 마다 방문했다 돌아오는 식으로 걸음수를 계산한후, 가장 먼곳에 있는 곳만을 두배 하지 않고 더해주면 된다.
댓글남기기