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

 

2217번: 로프

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

www.acmicpc.net

코드설명

그리디 알고리즘입니다.

 

우선 오름차순으로 정렬합니다.

여기서 array.sort로 오름차순 정렬을 하는 이유에 궁금증이 듭니다.

이유는, 최대한 적은 무게를 들 수 있는 무게를 나중에 배치함으로써 들 수 있는 무게를 최대한으로 하기 위함입니다.

로프가 최대한 많을때 가장 작은 수를 들 수 있도록 해야 최대값을 구할 수 있습니다.

 

예시로

1, 2, 3, 4 5 가 있다고 가정합니다.

 

이떄, 위의 로프들로 가장 많이 들 수 있는 무게를 구해보겠습니다.

일단 5가 max값이므로 5부터 시작하겠습니다.

 

5일떄는, 로프가 1개이므로 ( 5 * 1 ) 로  5만큼 들 수 있습니다.

4일때는, 로프가 2개이므로 ( 4 * 2 ) 8만큼 들 수 있습니다.

3일때는, 로프가 3개이므로 ( 3 * 3 ) 9만큼 들 수 있습니다.

2일때는, 로프가 4개이므로 ( 2 * 4 ) 8만큼 들 수 있습니다.

1일때는, 로프가 5개이므로 ( 1* 5 ) 5만큼 들 수 있습니다.

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;


public class Main {
	
	public static int N;
	public static int[] arr;
    public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	N = Integer.parseInt(st.nextToken());
    	
    	arr = new int[N];
    	
    	for(int i=0;i<N;i++) {
    		st = new StringTokenizer(br.readLine());
    		arr[i] = Integer.parseInt(st.nextToken());
    	}
    	Arrays.sort(arr);
    	
    	int max = arr[N-1];
    	for(int i = N-1; i >= 0;i--) {
    		arr[i] = arr[i] * (N - i);
    		if(max < arr[i]) max = arr[i];
    	}
    	System.out.println(max);
    }
    
}

+ Recent posts