Algorithm & Problem Solving/그리디 알고리즘(Greedy)
[백준 1461] 도서관 (Python)
baby_ohgu
2021. 2. 10. 16:18
문제풀이
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)
결과
문제풀이나 코드에서 이상한 부분 지적은 언제나 환영합니다!