https://www.acmicpc.net/problem/20115
문제
페인은 에너지 드링크를 좋아하는 회사원이다. 에너지 드링크는 카페인, 아르기닌, 타우린, 나이아신 등의 성분이 들어있어 피로 회복에 도움을 주는 에너지 보충 음료수이다.
야근을 마치고 한밤중에 퇴근하니 벌써 새벽 1시. 하지만 주말은 아직 멀었고, 다음 날에도 정시에 출근해야 하는 페인은 오늘도 에너지 드링크를 찾는다.
반복되는 야근에 지친 나머지, 평소보다 더 많은 에너지와 피로 회복이 필요했던 페인은 집에 있던 에너지 드링크들을 한 데 합쳐서, 하나의 에너지 드링크로 만들어 한번에 마시려 한다.
페인이 에너지 드링크들을 합치는 과정은 다음과 같다.
- 임의의 서로 다른 두 에너지 드링크를 고른다.
- 한쪽 에너지 드링크를 다른 쪽 에너지 드링크에 모두 붓는다. 단, 페인은 야근 후유증으로 인해 손이 떨려, 붓는 과정에서 원래 양의 절반을 바닥에 흘리게 된다.
- 다 붓고 남은 빈 에너지 드링크는 버린다.
- 1~3 과정을 에너지 드링크가 하나만 남을 때까지 반복한다.
예를 들어, 두 에너지 드링크 a, b가 있고, 양이 각각 xa, xb라 할 때, 다음 둘 중 하나의 선택을 할 수 있다.
- a의 양을 xa + (xb / 2)로 만들고, b를 버리기
- b의 양을 xb + (xa / 2)로 만들고, a를 버리기
페인은 합쳐진 에너지 드링크의 양을 최대로 하려 한다. 불쌍한 페인을 도와주자!
입력
첫째 줄에 페인이 가지고 있는 에너지 드링크의 수 N이 주어진다. (2 ≤ N ≤ 105)
둘째 줄에 각 에너지 드링크의 양이 공백으로 구분되어 주어진다. i번째 정수 xi (1 ≤ xi ≤ 109)는 에너지 드링크 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
# Code
n = int(input())
drink = list(map(int, input().split()))
drink.sort(reverse=True)
sum = drink[0]
for i in range(1, n):
sum+=drink[i]/2
print('%g'%sum)
# Comment
으악 지금 취침 30분 전에 넣어야하는 점안겔을 눈에 넣었더니 앞이 뿌얘졌다..............휴
나는 멍청하게 이 문제를 계속 작은 것부터 정렬해서 앞부터 합치고 있었는데.. 그냥 큰 것 부터 내림차순 정렬해서 가장 장 큰 거에 계속 더해주면 되는 문제였다.. 멍청이..
딱히 설명할 내용은 없고, '%g' 포맷팅 에 대해서 알았다. 이 문제에서는 int 값이 출력 될 경우 20.0 으로 나오는 것을 20으로 나오게 하기 위해서 사용했다. 답이 실수일 경우엔 소수점까지 잘 나온다.
* 파이썬 포맷팅 *
% (Formatting Operator) 앞의 포맷 템플릿에는 %s, %d 등과 같이 대입값 형식을 지정해 주는데 이를 변환 지시어(Conversion Specifier)라 부른다. 아래 표는 Conversion Specifier 들의 의미를 설명한 것이다.
Conversion Specifier의미
%s | 문자열 (파이썬 객체를 str()을 사용하여 변환) |
%r | 문자열 (파이썬 객체를 repr()을 사용하여 변환) |
%c | 문자(char) |
%d 또는 %i | 정수 (int) |
%f 또는 %F | 부동소수 (float) (%f 소문자 / %F 대문자) |
%e 또는 %E | 지수형 부동소수 (소문자 / 대문자) |
%g 또는 %G | 일반형: 값에 따라 %e 혹은 %f 사용 (소문자 / 대문자) |
%o 또는 %O | 8진수 (소문자 / 대문자) |
%x 또는 %X | 16진수 (소문자 / 대문자) |
%% | % 퍼센트 리터럴 |
Conversion Specifier는 % 와 Conversion 문자(예: s, d, f) 사이에 전체 자릿수와 소숫점 뒤자리수를 지정할 수 있다. 예를 들어 %10.2f 는 전체 10자리이고 값이 적으면 앞에 빈칸을 채우게 되고, .2 는 소수점 2째 자리까지만 표시한다는 것을 의미한다. 만약 %-10.2f 처럼 마이너스로 표현하면 전체 10자리인데 왼쪽으로 정렬한다는 의미이다.
파이썬 포맷팅 방법들에 대해서 상세히 나와있어서 읽어보면 좋을 듯 하다.
https://blockdmask.tistory.com/424
'백준 > 그리디' 카테고리의 다른 글
[백준] #20300 서강 근육맨 (python) (0) | 2022.02.24 |
---|---|
[백준] #11047 동전 0 (python) (0) | 2022.02.24 |
[백준] #11399 ATM (python) (0) | 2022.02.21 |
[백준] #11508 2+1 세일 (python) (0) | 2022.02.19 |
[백준] #1758 알바생 강호 (python) (0) | 2022.02.19 |
댓글