[알고리즘] BOJ 1461 도서관

김상현·2022년 4월 10일
0

알고리즘

목록 보기
68/301
post-thumbnail

[BOJ] 1461 도서관 바로가기

📍 문제

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


📍 입력

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


📍 출력

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


📍 풀이

✍ 코드

from sys import stdin
N, M = map(int,stdin.readline().split())
lst = list(map(int,stdin.readline().split()))
neg = [0] # 음수
pos = [0] # 양수
result = 0
for l in lst:
  if l < 0: neg.append(l) # 음수는 neg 배열에 추가
  else: pos.append(l) # 양수는 pos 배열에 추가
neg.sort(reverse=True) # 음수 내림차순 정렬
pos.sort() # 양수 오름차순 정렬
posLen = len(pos) # 양수의 갯수
negLen = len(neg) # 음수의 갯수
for i in range((posLen-1)%M, posLen, M):
  result += pos[i]*2
for i in range((negLen-1)%M, negLen, M):
  result += abs(neg[i])*2
result -= max(abs(neg[-1]),pos[-1])
print(result)
profile
목적 있는 글쓰기

0개의 댓글