Algorithm

[백준] 20115번: 에너지 드링크 - Node.js (자바스크립트)

sqsung 2023. 6. 13. 12:46

1. 문제 ㅡ 20115번: 에너지 드링크 (난이도: Silver III)

 

20115번: 에너지 드링크

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

www.acmicpc.net

2. 풀이 ㅡ Node.js (자바스크립트)

const [, input] = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const drinks = input
  .split(' ')
  .map(val => +val)
  .sort((a, b) => a - b);

const getMaxEnergy = () => {
  // drinks 배열에 하나의 음료수만 남을 때까지
  while (drinks.length > 1) {
  	// drinks 배열은 정렬되어 있기 때문에 제일 마지막 값이 제일 큰 값이다
    const bigger = drinks.pop();
    const smaller = drinks.pop();
    // 더 작은 음료수의 반을 흘린고, 더 큰 음료수와 합친 후 drinks 배열에 넣어준다
    const combined = bigger + smaller * 0.5;

    drinks.push(combined);
  }

  return drinks[0];
};

console.log(getMaxEnergy());

2-1. 풀이 설명

음료수가 한 개 남을 때까지 두 개의 음료수를 합치는데, 이때 한 음료의 반절은 흘리게 된다. 마지막 음료수가 될 수 있는 최댓값을 찾는 그리디 알고리즘 유형의 문제다. 

 

최대로 누적될 수 있는 값을 찾기 위해서는 음료수들을 오름차순으로 정렬해두고 시작해야 한다. 이후 음료수 배열에 하나의 값만 남을 때까지 아래 과정(1 ~ 3)을 반복하면 된다. 

 

   1. 배열에서 두 개의 음료수를 꺼낸다 (pop)

   2. 더 작은 값의 반절을 더 큰 값과 더한다 

   3. 합쳐진 값을 배열에 다시 넣어준다 (push)

 

반복문이 끝난 후 배열에 남아있는 유일 값을 출력하면 된다.