[HackerRank] Marc's Cakewalk

아르당·2024년 5월 8일
0

HackerRank

목록 보기
84/109
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

Problem

마크는 컵케익을 사랑하지만, 그는 또한 건강도 유지하고 싶다. 각 컵케익은 칼로리를 가지고 있고, 마크는 칼로리를 소모하기 위해 거리를 걸을 수 있다. 만약 마크가 j개의 컵케익을 먹었고, c 칼로리의 컵케이크를 먹은 후라면 그는 체중을 유지하기 위해 적어도 2^j * c 마일을 걸어야 한다.

Example

calorie = [5, 10, 7]

만약 그가 보이는 순서대로 컵케익을 먹었다면, 그가 걸어야하는 마일은
(2^0 5) + (2^1 10) + (2^2 7) = 5 + 20 + 20 = 53 이다. 이것은 최소값이 아니라서 우리는 다른 섭취 순서를 테스트를 해야한다. 이번 경우, 우리의 최소 마일은 (2^0 10) + (2^1 7) + (2^2 5) = 10 + 14 + 20 = 44로 계산된다. 각 칼로리가 각 컵케익 별로 주어질때, 마크가 그의 몸무게를 유지할 수 있게 걸어야 하는 마일의 최소값을 구해라.

Function Description

marcsCakewalk 함수를 완성해라.
marcsCakewalk 함수는 아래와 같은 매개변수를 가지고 있다.

  • int calorie[n]: 각 컵케익 별 칼로리

Returns

  • long: 필요한 마일의 최소값

Constraints

  • 1 <= n <= 40
  • 1 <= c[i] <= 1000

Solved

문제의 설명대로 풀면 쉽게 해결할 수 있다. 주어진 배열을 내림차순으로 정렬하고, Math.pow()를 사용해서 제곱값을 구하면 된다.

long 타입의 sum을 선언하고 0을 할당한다. 그리고 주어진 리스트 calorie를 내림차순으로 정렬한다.

long sum = 0;

calorie.sort(Comparator.reverseOrder());

반복문을 통해 calorie의 사이즈만큼 반복한다. 반복할때 sum에 구해준 값을 더한다.

for(int i = 0; i < calorie.size(); i++){
	sum += Math.pow(2, i) * calorie.get(i);
}

마지막으로 sum을 반환한다.

return sum;

All code

public static long marcsCakewalk(List<Integer> calorie) {

	long sum = 0;

	calorie.sort(Comparator.reverseOrder());

	for(int i = 0; i < calorie.size(); i++){
		sum += Math.pow(2, i) * calorie.get(i);
	}

	return sum;
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글