백준
[백준/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(); } } |