코딩테스트/자바 문제풀이

[그리디] 백준 2217 로프

승요나라 2024. 8. 21. 06:58

2217번: 로프

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

 

# 코드

import java.io.*;
import java.util.Arrays;
import java.util.Collections;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        // Collections.reverseOrder()를 사용하기 위해 Integer 배열 사용
        // (int 배열에서는 작동하지 않음)
        Integer arr[] = new Integer[n];
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }

        // arr를 내림차순으로 정렬
        Arrays.sort(arr, Collections.reverseOrder());

        // 최대 중량 계산
        long maxWeight = 0;
        for (int i = 0; i < n; i++) {
            // (i + 1)개 로프를 사용하고, 최소 중량은 arr[i]
            long currentWeight = (long)(i + 1) * arr[i];
            if (currentWeight > maxWeight) {
                maxWeight = currentWeight;
            }
        }

        System.out.println(maxWeight);
        br.close();
    }
}
  • 로프가 버틸 수 있는 총 중량은 "가장 약한 로프의 중량 * 로프 개수" 이며 이것이 최대가 되도록 답을 구하는 문제이다.
  • 주의할 점은 내림차순 정렬을 위해 int 배열이 아닌 Integer 배열을 사용하는 것이다.
  • Collections.reverseOrder() 는 int 배열에서는 작동하지 않는다.
  • 최대 중량 계산 시, 로프가 내림차순으로 정렬되어 있으므로 로프 개수를 (i + 1)개라고 코드를 작성할 수 있다.