일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 자바 ORM 표준 JPA 프로그래밍
- 객체지향 쿼리 언어
- scheduling messages with rabbitmq
- GitHub Actions
- 백엔드
- RESTClient
- JPQL
- kusitms
- jdbc
- ddd
- delayed message plugin
- 영속성
- rabbitmq-delayed-message-exchange
- java
- Spring
- Spring Batch
- 교육기획팀원
- JPA
- reactive operaton
- springboot
- 큐시즘
- 30기
- 한국대학생it경영학회
- cicd
- 교육기획팀
- 이펙티브자바
- 최범균
- 도메인 주도 개발 시작하기
- Domain Driven Design
- 자동처리
Archives
- Today
- Total
코딩은 마라톤
[백준] 2217번 : 로프 – JAVA [자바] 본문
[Silver IV] 로프 - 2217
성능 요약
메모리: 110084 KB, 시간: 1088 ms
분류
그리디 알고리즘, 수학, 정렬
문제 설명
N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다.
하지만 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다. k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다.
각 로프들에 대한 정보가 주어졌을 때, 이 로프들을 이용하여 들어올릴 수 있는 물체의 최대 중량을 구해내는 프로그램을 작성하시오. 모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다.
입력
첫째 줄에 정수 N이 주어진다. 다음 N개의 줄에는 각 로프가 버틸 수 있는 최대 중량이 주어진다. 이 값은 10,000을 넘지 않는 자연수이다.
출력
첫째 줄에 답을 출력한다.

- 문제 풀이
이 문제는 로프를 1개에서 N개까지 임의로 선택하여 가장 버틸 수 있는 최대 중량을 구해야 한다.
로프를 n개 선택해서 로프가 버틸 수 있는 중량보다 로프 1개를 이용해서 버티는게 더 클 경우를 생각해봐야 한다.
따라서 이 문제는 "내림차순으로 정렬" 하는 것이 중요하다.
- 로프의 개수 N을 입력 받고, 배열을 생성해 로프가 버틸 수 있는 최대 중량을 입력받는다.
- 버틸 수 있는 최대 중량이 큰 것부터 확인해야하기 때문에 내림차순으로 정렬한다.
- 최대 중량을 배열의 0번째 값으로 초기 설정한다. (max 변수)
- 1부터 N - 1번까지 반복문을 수행한다.
- 배열의 최솟값과 로프의 개수를 곱한게 현재 최댓값보다 크면(로프 1개를 이용해서 버티는 것보다 크면)
- 최댓값을 최솟값과 로프의 개수를 곱한 것으로 재설정해준다.
- max를 출력한다.
- 코드
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Integer[] ropes = new Integer[n];
for (int i = 0; i < n; i++) {
ropes[i] = sc.nextInt();
}
// 내림차순 정렬
Arrays.sort(ropes, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
int max = ropes[0]; // 최댓값 초기 설정은 0번째 index 값
for (int i = 1; i < n; i++) {
// 배열의 최솟값과 로프의 개수를 곱한게 현재 최댓값보다 크면
if (ropes[i] * (i + 1) >= max) {
// 최댓값을 재설정해준다.
max = ropes[i] * (i + 1);
}
}
System.out.println(max);
}
}
'CS > 알고리즘' 카테고리의 다른 글
[백준] 13305번 : 주유소 – JAVA [자바] (1) | 2023.10.16 |
---|---|
[백준] 1789번 : 수들의 합 – JAVA [자바] (0) | 2023.10.15 |
[백준] 1026번 : 보물 – JAVA [자바] (1) | 2023.10.13 |
[백준] 1931번 : 회의실 배정 – JAVA [자바] (0) | 2023.10.12 |
[백준] 11047번 : 동전 0 – JAVA [자바] (1) | 2023.10.11 |