본문 바로가기
코딩테스트

C ] leetCode 1561 - Maximum Number of Coins You Can Get

by eteo 2024. 2. 26.

 

 

 

리트코드 1561 문제

 

There are 3n piles of coins of varying size, you and your friends will take piles of coins as follows: 

  • In each step, you will choose any 3 piles of coins (not necessarily consecutive). 
  • Of your choice, Alice will pick the pile with the maximum number of coins. 
  • You will pick the next pile with the maximum number of coins. 
  • Your friend Bob will pick the last pile. 
  • Repeat until there are no more piles of coins. 

Given an array of integers piles where piles[i] is the number of coins in the ith pile. 

Return the maximum number of coins that you can have. 

 

 

Example 1: 

  • Input: piles = [2,4,1,2,7,8] 
  • Output: 9 
  • Explanation: Choose the triplet (2, 7, 8), Alice Pick the pile with 8 coins, you the pile with 7 coins and Bob the last one. Choose the triplet (1, 2, 4), Alice Pick the pile with 4 coins, you the pile with 2 coins and Bob the last one. The maximum number of coins which you can have are: 7 + 2 = 9. On the other hand if we choose this arrangement (1, 2, 8), (2, 4, 7) you only get 2 + 4 = 6 coins which is not optimal. 

 

Example 2: 

  • Input: piles = [2,4,5] 
  • Output: 4 

 

 

Example 3: 

  • Input: piles = [9,8,7,6,5,1,2,3,4] 
  • Output: 18 

 

 

Constraints: 

  • 3 <= piles.length <= 105 
  • piles.length % 3 == 0 
  • 1 <= piles[i] <= 104

 

 

문제에서 알 수 있는 전제조건은 다음과 같다.

 

1. pilesSize % 3 == 0 이고 뽑기는 pilesSize / 3 라운드 만큼 진행된다.

2. 내가 가질 수 있는 맥시멈 코인 개수를 구하기 위해 매 라운드마다 항상 앨리스는 가장 큰 수를 뽑고, 나는 두번째로 큰 수를 뽑으며, 밥은 제일 작은 수를 뽑는다고 가정한다.

 

위 조건을 고려하면 먼저 qsort로 내림차순 정렬을 한 다음에 pilesSize / 3 만큼 반복하면서 1 + 2 * i 만큼 포인터를 이동시켜 해당 위치 원소의 누적합을 구해 리턴하면 된다.

 

 

 

 

int compare(const void* a, const void* b) {
    return *(int *)b - *(int *)a;
}

int maxCoins(int* piles, int pilesSize) {
    int ret = 0;
    qsort(piles, pilesSize, sizeof(int), compare);
    piles++;
    for(int i = 0; i < pilesSize / 3 ; i++) {
        ret += *piles;
        piles += 2;
    }
    return ret;
}