[백준] 20115번 에너지 드링크 - python (실버3)

연기리·2023년 6월 30일

Algorithm

목록 보기
2/3
post-thumbnail

⚔️ 문제

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

야근을 마치고 한밤중에 퇴근하니 벌써 새벽 1시. 하지만 주말은 아직 멀었고, 다음 날에도 정시에 출근해야 하는 페인은 오늘도 에너지 드링크를 찾는다.

반복되는 야근에 지친 나머지, 평소보다 더 많은 에너지와 피로 회복이 필요했던 페인은 집에 있던 에너지 드링크들을 한 데 합쳐서, 하나의 에너지 드링크로 만들어 한번에 마시려 한다.

페인이 에너지 드링크들을 합치는 과정은 다음과 같다.

  1. 임의의 서로 다른 두 에너지 드링크를 고른다.
  2. 한쪽 에너지 드링크를 다른 쪽 에너지 드링크에 모두 붓는다. 단, 페인은 야근 후유증으로 인해 손이 떨려, 붓는 과정에서 원래 양의 절반을 바닥에 흘리게 된다.
  3. 다 붓고 남은 빈 에너지 드링크는 버린다.
  4. 1~3 과정을 에너지 드링크가 하나만 남을 때까지 반복한다.

예를 들어, 두 에너지 드링크 a, b가 있고, 양이 각각 xa, xb라 할 때, 다음 둘 중 하나의 선택을 할 수 있다.

a의 양을 xa + (xb / 2)로 만들고, b를 버리기
b의 양을 xb + (xa / 2)로 만들고, a를 버리기
페인은 합쳐진 에너지 드링크의 양을 최대로 하려 한다. 불쌍한 페인을 도와주자!

👩🏻‍💻문제 요약

N개의 음료가 주어지고, N개 중에서 2개를 골라서 하나는 통으로 하나는 반을 더한다.
반만 더한 음료는 남기지 않고 버린다.
그렇게 계속 더해서, 남는 음료의 양을 가장 크게 만든다.

🧐 풀이 핵심

무조건 하나는 1/2을 해야하므로, 1/2하는 대상은 제일 양이 적은 음료여야한다.
통으로 더하게 되는 음료는 당연히 제일 양이 많은 음료여야하므로,
입력받은 N개의 음료 list를 오름차순 sort한다.

이때 주의해야할 점은 1/2 할 때 정수가 아닌 소수로 더해야한다는 점 !(나만 일수도 ㅎ 나는 당연히 소수점 절사인 줄 알았다😅)

📝 정답 코드

N = int(input())
drinks = list(map(int, input().split()))

drinks.sort()

ans = 0.0
while(len(drinks) != 1):
    ans = drinks[0]/2 + drinks.pop()
    drinks.append(ans)
    if(len(drinks)) : 
        drinks.pop(0)

print(ans)
profile
저에게 말을 걸어주세요

0개의 댓글