-
[백준 1461] 도서관 (Python)Algorithm & Problem Solving/그리디 알고리즘(Greedy) 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)
결과
문제풀이나 코드에서 이상한 부분 지적은 언제나 환영합니다!
'Algorithm & Problem Solving > 그리디 알고리즘(Greedy)' 카테고리의 다른 글
[백준 19639] 배틀로얄 (Python) (0) 2021.02.05 [백준 4889] 안정적인 문자열 (Python) (0) 2021.02.05 [백준 2258] 정육점 (Python) (0) 2021.02.04 [백준 1041] 주사위 (Python) (0) 2021.01.30 [백준 1263] 시간 관리 (Python) (0) 2021.01.30