[백준/BOJ] 2217번 : 로프 (JAVA / 자바)
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/2217
- 문제 -
난이도 실버 4 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
풀이 방법
N개의 로프가 있고, 각 로프는 연결해서 무게 w를 나눠서 버틸 수 있다.
만약 버틸수 있는 무게가 10과 20인 로프가 있다면 최대로 버틸 수 있는 무게는 20이다. 이유는 20을 나눠서 버티면 10으로 10, 20으로 10을 버티게 된다. 만약 여기서 버텨야할 무게가 21이라면, 10.5이니 10으로는 버틸 수 없는 무게가 된다. 여기서 구하는 방법을 알면 좋겠지만, 모를 수도 있으니 예시를 하나 더 보자.
10, 30, 35이다. 그렇다면 버틸 수 있는 무게들을 보자.
세개의 로프로 버틸 경우 30버틸 수 있다. 이유는 최대 무게 / 로프의 개수 = 로프 중 제일 낮은 무게이기때문이다.
두개의 로프로 버틸 경우 30, 35의 로프로는 60을 버틸 수 있다.
한개의 로프로 버틸 경우 35의 로프로는 35를 버틸 수 있다.
그렇다면 버틸 수 있는 최대 무게는 60이 된다.
여기서 풀이 방법을 알 수 있을 것이다.
주어진 무게 값을 정렬한다. 제일 낮은 값부터 총 로프의 개수를 곱해준다. 한단계 높은 로프를 계산할때는 로프의 개수에서 1씩 빼준다. 그렇게 나온 값들 중 최댓값을 구해준다.
코드를 보자.
-풀이-
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
int max = 0;
for(int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
//정렬
Arrays.sort(arr);
for(int i = 0; i < N; i++) {
arr[i] *= (N - i);
if(max < arr[i]) max = arr[i];
}
System.out.println(max);
}
}
-결과-
아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.