데이터사이언스 기록기📚

[백준/Python] 1461번(그리디, 정렬)_도서관 본문

Coding Test/백준(Python)

[백준/Python] 1461번(그리디, 정렬)_도서관

syunze 2023. 5. 22. 20:47

📌문제 유형

그리디, 정렬 (골드5)

 

📌문제

 

1461번: 도서관

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

www.acmicpc.net

 

📌나의 문제풀이

- 리스트 양수, 음수로 나누어서 정렬(절댓값 큰 것이 앞으로 오도록)

- 리스트 양수, 음수의 인덱스가 m으로 나눈 값이랑 떨어지면, ans에 넣기

- ans 중 가장 큰 값은 한 번만 더하고(마지막으로 제자리에 놔둔 경우 0으로 돌아올 필요 없음), 나머지는 2번씩 더하기(0으로 다시 돌아와야 함)

n,m = map(int,input().split())
li = list(map(int,input().split()))
li_minus = []
li_plus = []

for num in li:
    if num < 0:
        li_minus.append(num)
    else:
        li_plus.append(num)

li_minus.sort()
li_plus.sort(reverse=True)

ans = []
for i in range(len(li_minus)):
    if i % m == 0:
        ans.append(abs(li_minus[i]))

for j in range(len(li_plus)):
    if j % m == 0:
        ans.append(abs(li_plus[j]))

ans.sort(reverse=True)
a = ans.pop(0)
answer = 0

answer += a
answer += sum(ans)*2

print(answer)

 

📌 다른사람의 문제풀이

- 가장 큰 값을 따로 빼놓는 경우 

N,M=[*map(int,input().split())]
books=[*map(int,input().split())]
 
positive_li = []; negative_li = []; last = 0
for b in books:
    last = max(abs(b),last)
    if b>0:
        positive_li.append(b)
    else:
        negative_li.append(abs(b))
positive_li.sort(reverse = 1); negative_li.sort(reverse = 1)
 
result = 0
for i in range(0, len(positive_li), M):
    result += positive_li[i]*2
for i in range(0, len(negative_li), M):
    result += negative_li[i]*2
print(result-last)
728x90
Comments