본문 바로가기
코딩일기/알고리즘

[백준 2217 : 실버4] 로프 (그리디/Java)

by 욱파이어니어 2021. 7. 29.
728x90
반응형

이번 문제는 처음부터 최대값을 구하고 최대값에 해당하는지를 체크하는 생각으로 문제를 풀었더니 문제가 풀리지 않아 힌트를 보고 문제를 풀었다.

 

 

 

문제를 살펴보자

 

 

문제

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

하지만 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다. k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다.

각 로프들에 대한 정보가 주어졌을 때, 이 로프들을 이용하여 들어올릴 수 있는 물체의 최대 중량을 구해내는 프로그램을 작성하시오. 모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다.

입력

첫째 줄에 정수 N이 주어진다. 다음 N개의 줄에는 각 로프가 버틸 수 있는 최대 중량이 주어진다. 이 값은 10,000을 넘지 않는 자연수이다.

출력

첫째 줄에 답을 출력한다.

 

 

 

 

 

문제 접근 방법

 

이번 문제의 접근 방법은 밧줄을 배열에서 한개씩 선택할때마다 들수 있는 무게의 최대값을 구하는것이다.

 

24,3,8,10

이렇게 밧줄이 입력 되었을때 

 

우리가 제일 먼저 해야할것은 내림 차순으로 정렬 하는것이다.

 

 

내림차순으로 정렬을 하게되면 아래와 같아진다.

 

24, 10, 8, 3

 

이렇게 정렬이 됐다면 이제 제일 큰값부터 접근해 들수 있는 최대 무게값을 구한다.

 

24 - max : 24

24, 10 - max : 20

24, 10, 8 - max : 24

24, 10, 8, 3 - max : 12

이렇게 된다.

 

여기서 우리가 알수 있는 점은 n개의 밧줄이 있을때 들수 있는 밧줄의 최대값은

n개의 밧줄중 최소값 * n 이다.

 

따라서 위의 내용을 소스로 만든것이 아래 내용이다.

		int max = 0;
		for(int i = 0;i<list.size();i++) {
			int su = list.get(i)*(i+1);
			if(max < su)
				max = su;
		}
		System.out.println(max);

이렇게 하게 되면 최대값을 가져올수 있다.

 

전체 소스는 아래와 같다.

 

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Run {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Run a = new Run();
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();
		
		ArrayList<Integer> list = new ArrayList<>();
		for(int i = 0; i<n;i++) {
			list.add(sc.nextInt());
		}
		
		Collections.sort(list,Collections.reverseOrder()); //오름 차순 정렬
		int max = 0;
		for(int i = 0;i<list.size();i++) {
			int su = list.get(i)*(i+1);
			if(max < su)
				max = su;
		}
		System.out.println(max);
	}
}

 

느낀점

1. 그리디 탐색은 일단 각각의 원소에 접근을 하고 각각의 원소에 접근했을때의 최선의 선택을 하면 된다.

2. 문제를 자세히 읽자.

 

반응형