멋쟁이v의 개발일지

[백준 2217번] 로프(파이썬) 본문

0년차/알고리즘(그리디)

[백준 2217번] 로프(파이썬)

멋쟁이v 2022. 11. 16. 20:12
728x90
320x100
문제
N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다.

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

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

 

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

 

출력
첫째 줄에 답을 출력한다.

 

예제 입력 1
2
10
15
예제 출력 1
20

 


 

풀이
이 문제는 모든 로프를 사용해야 할 필요는 없고 병렬로 연결 되어 있다는게 포인트인듯 하네요.
그리고 주어진 로프 정보들을 이용해서 들어올릴 수 있는 물체의 최대 중량을 구해야 합니다.
병렬 연결시에는 각각 로프에 동일한 중량으로 물체를 들어내야 합니다.

예를 들어서 5개의 로프가 주어지고 각각 1, 3, 5, 10, 20 이라고 했을때
로프를 5개 사용했을 때 : 1 * 5 = 5
로프를 4개 사용했을 때 : 3 * 4 = 12
로프를 3개 사용했을 때 : 5 * 3 = 15
로프를 2개 사용했을 때 : 10 * 2 = 20
로프를 1개 사용했을 때 : 20 * 1 = 20
이렇게 했을 때 들어올릴 수 있는 물체의 최대 중량은 20입니다.

예제 1
2개의 로프가 주어지고 10, 15의 로프 정보가 주어집니다.
로프를 2개 사용했을 때 : 10 * 2 = 20
로프를 1개 사용했을 때 : 15 * 1 = 15
들어올릴 수 있는 물체의 최대 중량은 20입니다.

결론으로 로프 정보들을 내림차순으로 정렬하고 차례로 로프 갯수만큼 곱해주면 된다.
그렇게 곱한 수 중에 제일 큰 수가 정답이 된다.

코드를 순서대로 작성한다면
1. 로프의 정보를 리스트 형식으로 저장
2. 내림차순 정렬
3. 로프의 정보들을 차례로 로프 갯수만큼 곱해준다.
4. 곱한 수를 정답 리스트에 저장
5. 정답 리스트에서 제일 큰 수를 뽑아낸다.


작성 코드
N = int(input())
R = [] # 로프의 정보를 담을 리스트 선언
for _ in range(N):
    R.append(int(input()))
    
R.sort(reverse = True) # 로프 정보들을 내림차순으로 정렬

answer = [] # 로프 갯수에 따라 곱한 수를 저장할 리스트 선언
for i in range(N): #
    answer.append(R[i] * [i+1]) # 로프 정보를 로프 갯수에 따라 차례로 곱하고 리스트에 저장
    
print(max(answer)) # 리스트 안에 제일 큰 수 출력
 
 
728x90
320x100
Comments