문제 링크 : https://www.acmicpc.net/problem/2217
문제 등급 : Silver IV
2217번: 로프
N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하
www.acmicpc.net
문제 해결 로직
- 로프의 길이를 오름 차순으로 나열하여 병렬로 세운다.
- 가장 작은 로프부터 for문을 돌면서 자기 자신의 길이만큼 남아 있는 루프에서 할당받아 병렬로 물건을 들어 올린다.
- 5, 4, 3, 2, 1의 로프가 있다.
- 1번의 로프를 활용하면 5개의 로프 모두 1만큼 사용할 수 있다. (1 * 5) = 5
- 2번의 로프를 활용하면 4개의 로프를 2만큼 사용할 수 있다. (2 * 4) = 8
- 3번의 로프를 활용하면 3개의 로프를 3만큼 사용할 수 있다. (3 * 3) = 9
- 4번의 로프를 활용하면 2개의 로프를 4만큼 사용할 수 있다. (4 * 2) = 8
- 5번의 로프를 활용하면 1개의 로프를 5만큼 사용할 수 있다. (5 * 1) = 5
- 2번은 반복하면서 가장 큰 무게를 구한다.
아래와 같이 소스를 공유합니다.
public class 로프 {
public static List<Integer> list = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
for(int i = 0; i < n; i++) {
int r = Integer.parseInt(br.readLine());
list.add(r);
}
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
});
int max = Integer.MIN_VALUE;
for (int i = 0; i < list.size(); i++) {
int r = list.get(i);
max = Math.max(max, r * (list.size() - i));
}
System.out.println(max);
}
}
'알고리즘 > 문제풀이 - 백준온라인저지' 카테고리의 다른 글
[BOJ 문자열] 괄호 9012.JAVA (0) | 2021.07.04 |
---|---|
[BOJ 그리디] 신입사원 1946.JAVA (0) | 2021.07.02 |
[BOJ 그리디] 잃어버린 괄호 1541.JAVA (0) | 2021.06.28 |
[BOJ 그리디] 회의실 배정 1931.JAVA (0) | 2021.06.25 |
[BOJ 그리디] 동전 0 11047.JAVA (0) | 2021.06.25 |