문제 링크 >> https://www.acmicpc.net/problem/2217
📋 문제
N(1 ≤ N ≤ 100,000)개의 로프가 있다.
이 로프를 이용하여 이런 저런 물체를 들어 올릴 수 있다.
각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다.
하지만 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다.
k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다.
각 로프들에 대한 정보가 주어졌을 때, 이 로프들을 이용하여 들어 올릴 수 있는 물체의 최대 중량을 구해내는 프로그램을 작성하시오.
모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다.
👉 입력
첫째 줄에 정수 N이 주어진다. 다음 N개의 줄에는 각 로프가 버틸 수 있는 최대 중량이 주어진다.
이 값은 10,000을 넘지 않는 자연수이다.
👈출력
첫째 줄에 답을 출력한다.
📝 풀이
import sys
n = int(sys.stdin.readline())
arr = []
for _ in range(n):
arr.append(int(sys.stdin.readline()))
arr.sort()
weight = []
for i in range(n, 0, -1):
weight.append(arr[len(arr)-i] * i)
print(max(weight))
문제를 이해하기 조금 어려웠던 문제이다.
문제에서 예제로 주어진 n = 2, arr = [10, 15]에 대해 이 문제를 설명해 보자면 다음과 같다.
10의 로프는 10의 무게를 들 수 있고 15의 로프는 15의 무게를 들 수 있다.
이때 물체의 무게가 15라면 15 로프는 이 물체를 들 수 있지만 10 로프는 이 물체를 들 수 없다.
반대로 물체의 무게가 10이라면 15 로프도, 10 로프도 이 물체를 들 수 있다.
따라서 이때 물체의 최대 무게는 10 * 2가 된다.
결국 이 문제의 풀이는 다음과 같다.
- 가장 작은 무게를 들 수 있는 로프 순으로 오름차순 정렬한다.
- 가장 작은 로프를 사용할 경우 이때 들 수 있는 무게의 최대는 (해당 로프가 들 수 있는 무게) * (로프의 최대 개수)이다.
- 즉, 가장 작은 로프를 사용하는 대신 로프의 개수를 최대로 사용하는 것이다.
- 가장 작은 로프를 사용하지 않을 경우 다음으로 들 수 있는 무게의 최대는 (다음 로프가 들 수 있는 무게) * (로프의 최대 개수 - 1)이다.
- 결국 이를 표준화 하면 (로프가 들 수 있는 무게) * (해당 로프와 같거나 무거운 것을 들 수 있는 로프의 개수) 이다.
- 이들 중 최댓값을 출력한다.
'Algorithm > Python' 카테고리의 다른 글
[프로그래머스] 기능 개발 (0) | 2022.02.17 |
---|---|
[프로그래머스] 프린터 (0) | 2022.02.17 |
[백준 11399번] ATM (0) | 2022.02.15 |
[백준11047번] 동전 0 (0) | 2022.02.15 |
[프로그래머스] 입국 심사 (0) | 2022.02.13 |
댓글