본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 에너지 드링크 : 20115번 - Python

728x90
반응형

https://www.acmicpc.net/problem/20115

 

20115번: 에너지 드링크

페인은 에너지 드링크를 좋아하는 회사원이다. 에너지 드링크는 카페인, 아르기닌, 타우린, 나이아신 등의 성분이 들어있어 피로 회복에 도움을 주는 에너지 보충 음료수이다. 야근을 마치고 한

www.acmicpc.net

 

 

 

문제의 접근 방법

 

- 합쳐진 에너지 드링크의 양을 최대로 하기 위해 입력된 에너지 드링크의 양을 내림차순으로 정렬하기

- 임의의 서로 다른 두 에너지 드링크를 고를 때, 두 개 중 더 양이 적은 에너지 드링크를 버리기

- 작은 숫자들을 이용해서 여러 조합을 그려보기 =>> 큰 수부터 나열해야 함을 알 수 있음

 

 

 

내가 막혔던 부분

 

- 아이디어는 생각했지만 코드로 구현하는 과정에서 시간이 조금 소요됨.

 

 

 

문제 풀이 방법

 

(1) 에너지 드링크 수(N) 입력받기

 

(2) N개의 에너지 드링크들의 양을 입력받아 리스트 x의 형태로 저장한 후, 내림차순으로 정렬하기

 

(3) 양을 누적해서 더하기 위해 초기에 선언한 변수 amount를 리스트 x의 제일 첫 번째 값으로 초기화하기

-> 이후에 합쳐진 에너지 드링크의 양을 더할 때, 제일 처음에 선택한 에너지 드링크(최댓값)는 무조건 더해지기 때문!

 

(4) (3)에서 선언해 둔 변수 amount에 절반을 흘리게 되는 에너지 드링크의 양을 누적해서 더해주기

-> 계속해서 양이 더 많은 에너지 드링크에 합쳐지기 때문에 x[0](최댓값)을 제외하고 x[1]이 선택되게 됨!

 

(5) 두 에너지 드링크 중 절반을 바닥에 흘린 에너지 드링크는 버려지기 때문에 x[1]을 제거해주기

 

(6) (4)~(5) 과정을 x[0](최댓값)만 남을 때까지 반복하기

 

(7) 합쳐진 에너지 드링크 양 amount 출력해주기

 

 

 

소스코드

N = int(input())    # 에너지 드링크 수

x = sorted(list(map(int, input().split())), reverse=True)
# 에너지 드링크의 양

amount = x[0]
for _ in range(len(x)-1):
    amount += x[1]/2
    del x[1]

print(amount)
728x90
반응형