[백준 1461 파이썬] 도서관

일단 해볼게·2023년 4월 11일
0

백준

목록 보기
116/132

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

import sys
input = sys.stdin.readline

n, m = map(int, input().rstrip().split())
walk = list(map(int, input().rstrip().split()))
plus_walk = []
minus_walk = []
max_walk = 0 # 제일 멀리 있는 책의 위치-1

for i in walk:
    # 양수와 음수를 나눈다.
    if i > 0:
        plus_walk.append(i)
    else:
        minus_walk.append(i)

    # 책을 모두 제자리에 놔둔 후에는 다시 0으로 돌아올 필요 없기때문에
    # 마지막 책은 제일 멀리 있는 책으로 정한다.
    if abs(i) > abs(max_walk):
        max_walk = i

# 양수는 내림차순으로 음수는 오름차순으로 정렬한다.
plus_walk.sort(reverse= True)
minus_walk.sort()

# 최소 걸음 수
walking = 0

# m권을 들고 양수 방향에 책을 모두 제자리에 놔둔다.
for j in range(0, len(plus_walk), m):
    # 제일 멀리 있는 책은 무시한다.
    if plus_walk[j] != max_walk:
        walking += plus_walk[j]

# m권을 들고 음수 방향에 책을 모두 제자리에 놔둔다.
for k in range(0, len(minus_walk), m):
    # 제일 멀리 있는 책은 무시한다.
    if minus_walk[k] != max_walk:
        # 최소 걸음 수를 계산하기 위해 절대값으로 바꿔 더한다.
        walking += abs(minus_walk[k])
        
# 최소 걸음 수는 책의 제자리 위치와 현재 책의 위치를 왕복하여 계산한다.
walking *= 2
# 제일 멀리 있는 책을 놔둔다.
walking += abs(max_walk)

print(walking)

책을 모두 제자리에 갖다놓으면 제자리로 돌아올 필요가 없다 -> 가장 먼 책을 마지막에 갖다 놓는다.

답 : 최소걸음수 * 2 + 가장 먼 책 거리

profile
시도하고 More Do하는 백엔드 개발자입니다.

0개의 댓글