문제
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() 함수를 통해 오름차순 정렬해주고 계산을 진행했다.
'백준 > 그리디' 카테고리의 다른 글
[백준] #1758 알바생 강호 (python) (0) | 2022.02.19 |
---|---|
[백준] #13305 주유소 (python) (3) | 2022.02.18 |
[백준] #1439 뒤집기 (python) (0) | 2022.02.16 |
[백준] #1343 폴리노미오 (python) (0) | 2022.02.16 |
[백준] #14916 거스름돈 (python) (0) | 2022.02.15 |
댓글