백준

[백준/JAVA] 2217번: 로프

찌끄랭이 2023. 2. 2. 20:27

문제 보러가기

 

2217번: 로프

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

www.acmicpc.net

[알고리즘]

1. 입력받은 배열을 오름차순으로 정렬한다.

2. 배열의 끝부분부터 로프의 개수를 세고 각 로프가 견디는 중량 중 최소한의 중량을 가지고 계산한다.

로프 중량
1 3
2 6
3 7
4 9

로프 4번부터 시작을 한다.

4번이 버틸 수 있는 중량은 9이다.

다음으로 4번과 3번이 버틸 수 있는 중량은 3번이 버틸 수 있는 중량 * 로프의 개수 2개이다. 즉 7kg * 2개 = 14kg이다.

그 다음으로 4번과 3번 그리고 2번이 버틸 수 있는 중량은 2번이 버틸수 있는 중량 6kg * 3개 = 18kg이다.

이것을 코드로 짜본다면

/*
  answer = 버틸 수 있는 최대 중량(정답)
  rope = 입력으로 주어진 로프
  numbers = 로프의 개수
*/
for (int i = N - 1; i >= 0; i--) {
    if (answer < rope[i] * numbers) {
           answer = rope[i] * numbers;
    }
    numbers++;
}

쉽게 설명드리자면, 여러 로프 중에 개별적으로 가장 낮은 중량을 버티는 로프를 로프의 개수들로 곱하면 된다.

 

[전체 코드]

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

class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int answer = 0;
        int numbers = 1;
        int N = Integer.parseInt(br.readLine());
        int[] rope = new int[N];
        for (int i = 0; i < rope.length; i++) rope[i] = Integer.parseInt(br.readLine());
        Arrays.sort(rope);
        for (int i = N - 1; i >= 0; i--) {
            if (answer < rope[i] * numbers) {
                answer = rope[i] * numbers;
            }
            numbers++;
        }
        bw.write(answer + "");
        bw.close();
    }
}