baby_ohgu 2021. 2. 10. 16:18

www.acmicpc.net/problem/1461

 

1461번: 도서관

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

www.acmicpc.net

 

문제풀이

N, M, arr : 입력값

negative, positive : 음수, 양수 리스트

distance : 책의 원래 위치까지 가야하는 최소 걸음 수 리스트

 

음수와 양수를 나누고, 절대값이 큰 것부터 M개씩 나눈 후, 그 중 절대값이 가장 큰 수 만큼 움직이면 된다. 가장 절대값이 큰 거리의 경우는 돌아오지 않아야 하는 예외를 처리해주어야 한다.

 

1. 음수, 양수로 나누기

- 절대값이 큰 순으로 정렬

 

2. 양수, 음수 각각에 대해 절대값이 큰 수부터 M개씩 나누고, 그 중 절대값이 가장 큰 수를 distance에 넣어준다.

- 양수, 음수 각각에 대해 해당하는 수의 개수가 M개로 나누어 떨어지지 않는 경우, 해당 수는 따로 분류하여 그 거리를 distance 에 넣어준다.

 

3. distance에 있는 절대값이 가장 큰 수를 제외하고, 나머지 수에 대해 2를 곱한 후 그 값을 결과(ans)에 더해준다.

 

코드

import sys

if __name__ == '__main__':
    N, M = map(int, sys.stdin.readline().split())
    arr = list(map(int, sys.stdin.readline().split()))
    negative, positive = [], []
    for y in arr:
        if y < 0: negative.append(y)
        else: positive.append(y)
    negative.sort(); positive.sort(reverse=True)

    distance = []
    for i in range(len(negative) // M):
        distance.append(abs(negative[i * M]))
    if len(negative) % M > 0:
        distance.append(abs(negative[(len(negative) // M) * M]))
    for i in range(len(positive) // M):
        distance.append(positive[i * M])
    if len(positive) % M > 0:
        distance.append(positive[(len(positive) // M) * M])
    distance.sort()
    ans = distance.pop()
    ans += 2 * sum(distance)
    print(ans)

 

결과

 

문제풀이나 코드에서 이상한 부분 지적은 언제나 환영합니다!