본문 바로가기
Algorithm/Python

[백준 2217번] 로프

by _sweep 2022. 2. 15.

문제 링크 >> 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. 가장 작은 무게를 들 수 있는 로프 순으로 오름차순 정렬한다.
  2. 가장 작은 로프를 사용할 경우 이때 들 수 있는 무게의 최대는 (해당 로프가 들 수 있는 무게) * (로프의 최대 개수)이다.
    • 즉, 가장 작은 로프를 사용하는 대신 로프의 개수를 최대로 사용하는 것이다.
  3. 가장 작은 로프를 사용하지 않을 경우 다음으로 들 수 있는 무게의 최대는 (다음 로프가 들 수 있는 무게) * (로프의 최대 개수 - 1)이다.
  4. 결국 이를 표준화 하면 (로프가 들 수 있는 무게) * (해당 로프와 같거나 무거운 것을 들 수 있는 로프의 개수) 이다.
  5. 이들 중 최댓값을 출력한다.

 

 

 

 

 

 

'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

댓글