알고리즘 정복하기!/백준 문제풀이

백준 1461번 Python / Greedy

by seokii 2022. 2. 26.
728x90
반응형

문제풀이 GitHub

https://github.com/Seokii/baekjoon

 

GitHub - Seokii/baekjoon: Daily Commit for Baekjoon

Daily Commit for Baekjoon. Contribute to Seokii/baekjoon development by creating an account on GitHub.

github.com

 

문제 링크

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

 

1461번: 도서관

세준이는 도서관에서 일한다. 도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다. 세준이는 현재 0에 있고, 사람들이 마구 놓은 책도 전부 0에 있다. 각 책

www.acmicpc.net

 

풀이

n,m = map(int, input().split())
books = list(map(int, input().split()))

plus=[]
minus=[]
for i in books:
    if i > 0: plus.append(i)
    else : minus.append(abs(i))

plus.sort(reverse=True)
minus.sort(reverse=True)

count = []

for i in range(len(plus)//m):
    count.append(plus[i*m])
if len(plus) % m > 0:
    count.append(plus[(len(plus) // m) * m])

for i in range(len(minus)//m):
    count.append(minus[i*m])
if len(minus) % m > 0:
    count.append(minus[(len(minus) // m) * m])

count.sort()
answer = count.pop()
answer += 2*sum(count)
print(answer)

받은 수를 양수와 음수로 구분하여 리스트에 추가했습니다.

음수는 abs()를 사용해 절댓값을 계산해 양수로 변환 후 리스트에 추가했습니다.

그 후 두 개의 리스트를 내림차순으로 정렬했습니다.

count 리스트를 만들어, 가져갈 수 있는 책의 수만큼 index를 지정해 추가했습니다.

이후 가져갈 수 있는 만큼 보다 더 적은 수의 책이 리스트의 끝쪽에 남아 있는 경우를 생각해, if문으로 처리했습니다.

이후 count리스트를 오름차순으로 정렬하고, 마지막의 값(본래의 위치로 안 돌아와도 되기 때문)만 한 번 더하고 나머지는 2를 곱해 더한 후 출력했습니다.

 

 

728x90
반응형

댓글