알고리즘/백준

[파이썬, 자바] BOJ_2217(로프)

딱따구르리 2021. 2. 11. 18:33
728x90
반응형

문제

 

https://www.acmicpc.net/problem/2217

 

2217번: 로프

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

www.acmicpc.net


 

해설

 

적은 중량을 드는 로프는 큰 중량을 드는 로프만큼 들 수 없다.

큰 중량 로프가 적은 중량 로프한테 맞춰줘야 한다.

ex) 15, 30 짜리 로프가 있을 때, 

     15는 30만큼 들 수 없지만 / 30은 15만큼 들 수 있다.

 

로프가 [3, 5, 10, 15, 30] 있을 때,

 

30은 -> 30만 들 수 있고(1개)

 

15는 -> 15, 30(2개)

 

10은 -> 10, 15, 30(3개)

 

5는 -> 5, 10, 15, 30(4개)

 

3은 -> 3, 5, 10, 15, 30이 들 수 있다.(5개)

 

가장 큰 중량 로프일수록 가장 적은 개수로만 들 수 있으니

로프를 내림차순으로 정리하여,

1부터 곱해주면 된다.

 

그렇게 나온 결과 중에서 가장 큰 값을 찾으면 된다.


코드

 

-파이썬

#백준 2217(로프)

n = int(input())  #줄 개수
weight = []
res = []

for i in range(n):
    weight.insert(i, int(input()))

weight.sort(reverse=True)

for j in range(n):
    res.insert(j, weight[j] * (j + 1))

print(max(res))

 

-자바

//백준 2217(로프)
import java.util.*;
import java.io.*;

public class Boj_2217 {

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(br.readLine());  //로프 개수
		int[] weight = new int[n];
		int res = 0;
		
		for(int i = 0; i < n; i++) {
			weight[i] = Integer.parseInt(br.readLine());
		}
		
		Arrays.sort(weight);
		
		for(int j = n - 1; j >= 0; j--) {
			if(res < weight[j] * (n - j)) {
				res = weight[j] * (n - j);
			}
			
		}
		
		System.out.println(res);
	}

}
728x90
반응형