본문 바로가기
BaekJoon/JAVA

[백준] 2217번 : 로프(JAVA)

by GrayChoi 2020. 2. 13.
반응형

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

 

2217번: 로프

N(1≤N≤100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하지만 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다. k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다. 각 로프들에 대한 정보가 주어졌을 때, 이 로프들을

www.acmicpc.net


위의 문제는 BaekJoon Online Judge의 알고리즘 분류 중 

 

그리디 알고리즘의 카테고리에 포함되어 있는 문제이다.

 

주의점은 "모든 로프를 사용해야 할 필요는 없으며,

 

임의로 몇 개의 로프를 골라서 사용해도 된다."라는 점이다.

 

처음에 저 주의점을 안보고 풀다가 왜 틀렸는지 고민했다.

 

풀이는 먼저 로프를 int배열로 입력을 받은 다음 정렬을 시킨다.

 

그 다음 배열의 첫 번째 값과 로프의 개수를 곱해서 다시 배열에 저장하고,

 

두 번째는 로프의 개수 - 1을 해서 다시 배열에 저장한다.

 

이런 방식으로 로프의 개수를 한 개씩 줄여가면서 저장한 다음,

 

다시 배열을 정렬하고 배열의 맨 마지막인 최대값을 출력한다.

 

import java.util.Scanner;
import java.util.Arrays;

public class Question_2217 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int number = sc.nextInt();
		
		int[] rope = new int[number];
		
		for(int i = 0; i < number; i++) {
			rope[i] = sc.nextInt();
		}
		
		Arrays.sort(rope);
		
		for(int i = 0; i < number; i++) {
			rope[i] = rope[i] * (number-i);
		}
		
		Arrays.sort(rope);
		
		System.out.println(rope[number-1]);
		
	}
	
}
반응형

댓글