2217 로프

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

문제설명

그리디 알고리즘을 사용하여 주어진 로프들로 최대 하중을 지탱할 수 있는 방법을 찾기

 

  • 주어진 N개의 로프가 있으며, 각 로프는 특정 하중까지 지탱할 수 있다.
  • 로프를 여러 개 묶어서 사용할 때, 전체 하중은 묶인 로프의 최소 하중에 따라 결정된다.
  • 로프들을 최적의 조합으로 사용하여 가능한 최대 하중을 계산다.

 

접근방식

O(N log N)  시간복잡도

 

N개의 로프 정보를 받고 

배열을 오름차순으로 정렬한다.

 

문제 조건 분석 과정

 

  • 입력받은 로프의 하중을 내림차순으로 정렬한다. (가장 강한 로프를 먼저 고려)
  • 정렬된 배열의 각 로프의 하중을 (N - i)로 곱한다.
  • 여기서 N - i는 현재 로프와 그 이후의 로프를 묶었을 때 사용할 수 있는 로프의 개수이다.
  • 이 값들 중 최대값을 찾아 출력한다. 최대값이란, 로프들을 묶었을 때 가능한 최대 하중이다.

 

사용된 자료구조

  • 배열: 로프의 최대 하중을 arr에 담는다. 배열의 인덱스는 로프의 순서를 나타내며,
  • 각 값은 해당 로프의 최대 하중을 나타낸다.
  • 정렬: 배열을 정렬하여 가장 큰 하중부터 순서대로 계산한다.

전체코드

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

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());
        int[] arr = new int[N];
        int max = 0;

        for(int i = 0; i < N; i++){
            arr[i] = Integer.parseInt(br.readLine());
        }

        Arrays.sort(arr);

        //배열의 요소에 N - i를 곱한 후 최대값 갱신
        for(int i = 0; i < N; i++){
            arr[i] *= (N - i); //현재 요소에 (N - i) 곱함
            if(max < arr[i]) max = arr[i]; //최대값 갱신
        }

        System.out.println(max);
        br.close();
    }
}

 

'자료구조 > 문제풀이' 카테고리의 다른 글

[백준 JAVA] 13305 주유소  (0) 2024.08.01
[백준 JAVA] 11047 동전  (0) 2024.08.01
[백준 JAVA] 2141 우체국  (0) 2024.08.01
[백준 JAVA] 1758 알바생  (0) 2024.08.01
[백준 JAVA] 1541 잃어버린 괄호  (0) 2024.08.01

+ Recent posts