Rego의 블로그

백준 2217 파이썬 로프 본문

BEAKJOON

백준 2217 파이썬 로프

RegularPark 2021. 9. 22. 16:55

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

 

2217번: 로프

N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하

www.acmicpc.net

 

   문제는 이렇다. 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다. k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다.

모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다.

 

   로프를 저장할 리스트와 그를 이용해 들어올릴 수 있는 중량을 저장할 리스트를 만든다. 로프 리스트를 들 수 있는 중량의 내림차순으로 정렬하면 이해가 좀 더 쉬워진다. 

예를 들어 3개의 로프 [40, 15, 10]가 있다. 

 

case 1. [40] 로프 1개로는 w = 40 * 1 = 40인 물체를,

case 2. [40]과 [15] 로프로는 상대적으로 약한 로프인 [15] 로프를 기준으로 고르게 중량이 걸려

          w = 15 + 15 = 15 * 2 = 30인 물체를, 

case 3. [40]과 [15], [10] 로프로는 가장 약한 로프인 [10] 로프 기준으로 

          w = 10 + 10 + 10 = 10 * 3 = 30인 물체를 들어올릴 수 있다.

 

   이를 토대로 코드를 짰다. 간단히 말해 로프 리스트를 내림차순으로 정리한 후

"로프_리스트[n] * (n+1)를 모아 만든 리스트 내 최댓값"을 출력하도록 하면 된다는 것이다.

 

 

n = int(input())
r_lst = []
weight = []
for i in range(n):
    rope = int(input())
    r_lst.append(rope)
r_lst.sort(reverse=True)

for j in range(n):
    weight.append(r_lst[j]*(j+1))
print(max(weight))