본문 바로가기
백준/그리디

[백준] #2217 로프 (python)

by 똥먹는낙타 2022. 2. 18.
728x90
반응형

2217번: 로프 (acmicpc.net)

 

2217번: 로프

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

www.acmicpc.net

 

문제

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

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

각 로프들에 대한 정보가 주어졌을 때, 이 로프들을 이용하여 들어올릴 수 있는 물체의 최대 중량을 구해내는 프로그램을 작성하시오. 모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다.

입력

첫째 줄에 정수 N이 주어진다. 다음 N개의 줄에는 각 로프가 버틸 수 있는 최대 중량이 주어진다. 이 값은 10,000을 넘지 않는 자연수이다.

출력

첫째 줄에 답을 출력한다.

 

예제 입력1

2
10
15

예제 출력1

20

 


# Code

k = int(input())

rope = []
for i in range(k):
    rope.append(int(input()))

rope.sort() #로프가 길이 순으로 제공된다는 가정이 없었기 때문에..

max = rope[0]*k
for i in range(len(rope)-1):
    if max < rope[i+1]*(k-(i+1)):
        max = rope[i+1]*(k-(i+1))
    
print(max)

# Comment

오랜만에 혼자만의 힘으로 푼 문제인 것 같은데.. (사실 처음일지도)

뭐지 실버5문제보다 쉬웠던 느낌..?

(각각의 로프의 길이 * 사용하는 로프 갯수) 값이 가장 큰 것을 최대 무게로 구했다.

즉, 만약에 로프가 5 10 15 세개 있다고 가정하면,

                    5*3 10*2 15*1  의 크기를 비교한다.

5*3 같은 경우 길이가 5인 로프는 다 쓰고, 길이가 10인 로프와 15인 로프는 5만큼 사용한다.

10*2 같은 경우 길이가 5인 로프는 쓰지 않고, 길이가 10인 로프는 다 쓰고 15인 로프를 10만큼 사용한다.

15*1 같은 경우 길이가 5, 10인 로프는 쓰지 않고, 길이가 15인 로프 한 개만 전부 사용한다.

 

길이가 10인 로프를 다 사용하고 15인 로프를 10만큼 사용하는 방법이 20이라는 가장 큰 중량을 걸 수 있으므로 답은 20이 된다.

=> (가장 짧은 로프의 길이 * 로프의 총 갯수) 를 초기에 max 값으로 두고 로프의 길이가 길어질수록 각각의 로프의 길이에 로프 갯수를 하나씩 빼 가면서 곱하여 max 값과 비교해가면서 가장 값이 큰 것을 답으로 구했다.

*point* 여기서 착각해서 실수를 한 부분이 있는데, 로프의 길이는 무조건 오름차순으로 제공되는 것이 아니라, 10 15 5 이런 식으로 주어질수도 있다는 것을 깨달았다. 따라서 처음에 로프의 길이를 rope 배열에 다 받고 나서 sort() 함수를 통해 오름차순 정렬해주고 계산을 진행했다.

 

728x90
반응형

댓글