코린이의 소소한 공부노트

[LeetCode/Medium] 1561. Maximum Number of Coins You Can Get 본문

코딩테스트 풀이/JAVA

[LeetCode/Medium] 1561. Maximum Number of Coins You Can Get

무지맘 2022. 8. 19. 11:33

1. Input

1) 3n개의 음이 아닌 정수를 담은 int 배열 piles

2) piles[i]는 동전 더미이며, piles[i]의 값은 동전의 개수를 나타낸다.

3) 나를 포함한 3명이 동전을 나눠가질 예정이다.

4) 내가 3n개의 동전 더미 중 3개를 골랐을 때, 셋 중 동전의 개수가 2번째로 많은 더미를 가져갈 것이다.

 

2. Output

1) 내가 최대한으로 가져갈 수 있는 동전의 개수를 담은 int 변수 max

2) 동전 더미는 남는 것 없이 모두 가져가야 한다.

 

3. Constraint

1) 3 <= piles.length <= 105

2) piles.length % 3 == 0

3) 1 <= piles[i] <= 104

 

4. Example

Input: piles = {2,4,1,2,7,8}
Output: 9

설명:

  - 처음에 (2,7,8)을 고르면, 나는 7개를 가져갈 수 있다. 그다음 (2,4,1)을 고르면, 나는 2개를 가져갈 수 있다. -> 9개

  - 처음에 (4,1,8)를 고르면, 나는 4개를 가져갈 수 있다. 그다음 (2,2,7)을 고르면, 나는 2개를 가져갈 수 있다. -> 6개

  - 어떻게 해도 9개보다 많은 동전을 가져갈 수는 없다.

 

5. Code

1) 첫 코드(2022/08/19)

Arrays.sort(piles);
int max = 0;
for(int i=piles.length/3 ; i<piles.length ; i+=2)
    max += piles[i];
return max;

  - piles를 크기 순으로 정렬한다.

  - 내가 고른 것이 (a,b,c)이고 a<b<c일 때, b만 가져가므로 a에 들어갈 수 있는 동전 더미는 piles[0]~piles[n -1]에서 할당해주면 된다.

  - 남은 2n개의 더미들 중 내가 최대로 많이 가져가려면

    - c에 들어가는 것: piles[3n-1], piles[3n-3], ..., piles[n+1]

    - b에 들어가는 것: piles[3n-2], piles[3n-4], ..., piles[n]

  - 따라서 n번째부터 1개씩 건너뛰면서 더해주면 된다.