설명
페인은 에너지 드링크를 좋아하는 회사원이다. 에너지 드링크는 카페인, 아르기닌, 타우린, 나이아신 등의 성분이 들어있어 피로 회복에 도움을 주는 에너지 보충 음료수이다.
야근을 마치고 한밤중에 퇴근하니 벌써 새벽 1시. 하지만 주말은 아직 멀었고, 다음 날에도 정시에 출근해야 하는 페인은 오늘도 에너지 드링크를 찾는다.
반복되는 야근에 지친 나머지, 평소보다 더 많은 에너지와 피로 회복이 필요했던 페인은 집에 있던 에너지 드링크들을 한 데 합쳐서, 하나의 에너지 드링크로 만들어 한번에 마시려 한다.
페인이 에너지 드링크들을 합치는 과정은 다음과 같다.
1. 임의의 서로 다른 두 에너지 드링크를 고른다.
2. 한쪽 에너지 드링크를 다른 쪽 에너지 드링크에 모두 붓는다. 단, 페인은 야근 후유증으로 인해 손이 떨려, 붓는 과정에서 원래 양의 절반을 바닥에 흘리게 된다.
3. 다 붓고 남은 빈 에너지 드링크는 버린다.
4. 1~3 과정을 에너지 드링크가 하나만 남을 때까지 반복한다.
예를 들어, 두 에너지 드링크 a, b가 있고, 양이 각각 Xa, Xb라 할 때, 다음 둘 중 하나의 선택을 할 수 있다.
- a의 양을 xa + (xb / 2)로 만들고, b를 버리기
- b의 양을 xb + (xa / 2)로 만들고, a를 버리기
페인은 합쳐진 에너지 드링크의 양을 최대로 하려 한다. 불쌍한 페인을 도와주자!
입력
첫째 줄에 페인이 가지고 있는 에너지 드링크의 수 N이 주어진다. (2 ≤ N ≤ 10의 5승)
둘째 줄에 각 에너지 드링크의 양이 공백으로 구분되어 주어진다. i번째 정수 Xi (1 ≤ Xi ≤ 10의 9승)는 에너지 드링크 i의 양이 Xi임을 의미한다.
출력
첫째 줄에 페인이 최대로 만들 수 있는 에너지 드링크의 양을 출력한다.
절대/상대 오차는 10-5까지 허용한다.
예시 입력1
5
3 2 10 9 6
예시 출력1
20
예시 입력2
10
100 9 77 65 39 27 45 1 80 495
예시 출력2
716.5
풀이
[로직]
에너지 드링크 양인 Xi를 오름차순으로 정렬하고 첫번째 에너지 드링크 양을 초기값으로 해서 나머지 에너지 드링크 양들을 반 나누고 초기값에 누적하는 로직으로 문제를 풀었다. 정렬에는 Collections.sort(오름차순 정렬)와 Collections.reverse(뒤집기)를이용했다.
[입력]
자바에서 int는 10의 9승, long은 10의 18승 정도까지를 범위로 갖기 때문에 입력은 int 형으로 받았다.
[출력]
예시 출력을 보니 답이 소수점이 있는 경우에는 소수점까지 출력하고, 소수점이 없는 경우 정수로 출력을 했다. 찾아보니 java.text.DecimalFormat을 사용하여 출력 형식을 지정할 수 있음을 알았다. 사용 방법은 DecimalFormat 객체를 생성하고 생성자 매개변수로 포맷을 지정해주면 된다.
#은 값이 있으면 숫자를 표시하고, 값이 없으면 아무것도 표시하지 않는 역할을 한다. 따라서 소수점 아래 숫자가 0일 경우, 즉 실질적으로 소수점이 없는 경우 정수 부분만 출력된다. 소수점 아래에 유효한 숫자가 있으면 해당 숫자까지 함께 출력된다.
이 방법을 사용하면 소수점 아래가 0인 경우 정수로 출력하고, 그렇지 않은 경우 소수점 아래 숫자를 포함하여 출력할 수 있다.
DecimalFormat formatter = new DecimalFormat("#.#####");
sb.append(formatter.format(solution(arr)));
코드
package baekjoon._20115;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
public static double solution(ArrayList<Integer> arr) {
Collections.sort(arr);
Collections.reverse(arr);
double answer = arr.get(0);
for(int i = 1; i < arr.size(); i++) {
answer += (double) arr.get(i) / 2;
}
return answer;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
ArrayList<Integer> arr = new ArrayList<>();
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i = 0; i < N; i++) {
arr.add(Integer.parseInt(st.nextToken()));
}
DecimalFormat formatter = new DecimalFormat("#.#####");
sb.append(formatter.format(solution(arr)));
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
'Baekjoon' 카테고리의 다른 글
[백준/자바] 14916번 거스름돈 (0) | 2024.03.27 |
---|---|
[백준/자바] 1946번 신입 사원 (1) | 2024.03.26 |
[백준/자바] 1439번 뒤집기 (0) | 2024.03.26 |
[백준/자바] 1026번 보물 (1) | 2024.03.24 |
[백준/자바] 11047번 동전 0 (0) | 2024.03.23 |