Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++로 리더보드 디자인하기


리더보드 클래스를 디자인해야 한다고 가정하면 세 가지 다른 기능이 있습니다. −

  • addScore(playerId, score) - 주어진 플레이어의 점수에 점수를 추가하여 리더보드를 업데이트합니다. 리더보드에 주어진 ID를 가진 플레이어가 없을 경우, 주어진 점수로 리더보드에 추가합니다.
  • top(K) - 상위 K 플레이어의 점수 합계를 반환합니다.
  • reset(playerId) - 주어진 ID를 가진 플레이어의 점수를 0으로 재설정합니다. 이 함수를 호출하기 전에 플레이어가 리더보드에 추가되었음을 보장합니다.

처음에는 리더보드가 비어 있어야 합니다.

아래와 같은 작업을 수행하면 -

  • 리더보드 리더보드 =새로운 리더보드();
  • leaderboard.addScore(1,73); // 리더보드는 [[1,73]];
  • leaderboard.addScore(2,56); // 리더보드는 [[1,73],[2,56]];
  • leaderboard.addScore(3,39); // 리더보드는 [[1,73],[2,56],[3,39]];
  • leaderboard.addScore(4,51); // 리더보드는 [[1,73],[2,56],[3,39],[4,51]];
  • leaderboard.addScore(5,4); // 리더보드는 [[1,73],[2,56],[3,39],[4,51],[5,4]];
  • leaderboard.top(1); // 73을 반환합니다.
  • leaderboard.reset(1); // 리더보드는 [[2,56],[3,39],[4,51],[5,4]];
  • leaderboard.reset(2); // 리더보드는 [[3,39],[4,51],[5,4]];
  • leaderboard.addScore(2,51); // 리더보드는 [[2,51],[3,39],[4,51],[5,4]];
  • leaderboard.top(3); // 141 =51 + 51 + 39를 반환합니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • pq라는 정수 쌍의 우선 순위 대기열을 정의하고 int 유형 키와 int 유형 값 m의 하나의 맵을 만듭니다. 초기화를 위해 맵을 지우고 큐가 비어 있지 않으면 큐에서 모든 요소를 ​​삭제합니다.
  • addScore() 메서드는 다음과 같습니다. -
    • playerId가 있는 경우 m[playerId] :=m[playerId] + 점수
    • pq에 쌍(m[playerId], playerId) 삽입
    • 그렇지 않으면 m[playerId] =점수
  • top() 메서드는 다음과 같습니다.
  • temp 쌍의 벡터를 만들고 합계를 0으로 설정
  • k가 0이 아닌 동안
    • curr :=pq의 상단, pq에서 삭제
    • m[통화 쌍의 두 번째 값] =통화 쌍의 첫 번째 값인 경우
      • k를 1 감소
      • sum :=sum + curr의 첫 번째 값
      • 온도에 curr 삽입
  • 0에서 temp 크기까지의 i에 대해
    • pq에 temp[i] 삽입
  • reset() 함수는 다음과 같습니다 -
    • m[playerId] =0

예(C++)

더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
class Leaderboard {
public:
   priority_queue< pair <int,int> > pq;
   map < int, int > m;
   Leaderboard() {
      m.clear();
      while(!pq.empty())pq.pop();
   }
   void addScore(int playerId, int score) {
      if(m.find(playerId)!=m.end()){
         m[playerId] += score;
      }
      else m[playerId] = score;;
         pq.push({m[playerId], playerId});
   }
   int top(int k) {
      vector < pair <int,int> > temp;
      int sum = 0;
      while(k){
         pair <int, int> curr = pq.top();
         pq.pop();
         if(m[curr.second] == curr.first){
            k--;
            sum += curr.first;
            temp.push_back(curr);
         }
      }
      for(int i = 0; i < temp.size(); i++)pq.push(temp[i]);
      return sum;
   }
   void reset(int playerId) {
      m[playerId] = 0;
   }
};
main(){
   Leaderboard ob;
   ob.addScore(1,73);
   ob.addScore(2,56);
   ob.addScore(3,39);
   ob.addScore(4,51);
   ob.addScore(5,4);
   cout <<ob.top(1) << endl;
   ob.reset(1);
   ob.reset(2);
   ob.addScore(2,51);
   cout <<ob.top(2) << endl;
}

입력

Initialize leader board then use the functions to see different results. See the main() function

출력

73
102