
Free Board - 자유 게시판
몇일 전 어떤 글에서 실시간으로 랭킹을 처리하는 곳을 보았다고 합니다.
그 후 구현 방법에 대한 아이디어가 떠올라 이렇게 몇자 적어봅니다.
내용을 보시고 오류나 개선사항이 있으시면 댓글 바랍니다.
[ 전제 조건 ]
- 랭킹의 기준이 되는 수치를 X이라 할 때 X의 값은 증가만 한다.
- 랭킹을 위한 데이타베이스를 별도로 둔다.
- X의 값은 동시에 수정될 수 없다.
[ 구현 ]
- 유저 U의 X 값이 변경될 때, 변경되기 전 X의 값을 Xo라하고 변경된 후 X의 값을 Xn이라 하자. 이 때 Xo < Xn이 성립된다.
- Xn 이상의 값을 가진 유저 그룹을 Ua, Xo 이상 Xn 미만의 값을 가진 유저 그룹을 Um, Xo 미만의 값을 가진 유저 그룹을 Ub이라 할 때 각 그룹의 랭킹과 자신의 랭킹은 다음과 같다.
Ua 그룹은 랭킹의 변화가 없다.
Um 그룹은 현재 랭킹 + 1이다.
Ub 그룹은 랭킹의 변화가 없다. - 유저 U의 랭킹은 다음과 같다.
U라는 유저의 랭킹은 Xn을 가진 유저의 랭킹과 동일하다.
U라는 유저의 랭킹은 Xn 초과 값 중 가장 작은 값을 가진 유저의 수와 랭킹을 N, Xa라 할 때
N이 0이면 U의 랭킹은 1이며
N이 0이 아니면 U의 랭킹은 Xa + N이다.
2008.11.30 03:06:09
에네드님께서 아래와 같이 2가지를 지적하셨네요.
1. Xo > Xn인 경우
2. 동점자 처리에서 공동 순위에 대한 정책
지적하신 1번의 경우는 전제조건 1번을 위배됩니다.
지적하신 2번의 경우는 전제조건에 서술되어 있지 않지만 동점자가 있다라는 가정하에서 위 로직을 생각해 본 것입니다. 모든 랭킹이 님이 지적해주신 방식으로 처리하는 것은 아니니까요. 그러나, 좋은 지적 감사합니다.
덧붙여, 위 로직은 실시간 랭킹 시스템의 가능성 여부를 판단하는 것이 목적이였습니다.
즉, 여러 경우의 랭킹을 처리하는 것이 아닙니다. 단순한 랭킹을 구하려해도 랭킹은 실시간으로 처리하게끔 구현하기가 무리가 있기에 가능성에 대해서 의견을 구하고자 위 로직을 올려놓은 것입니다.
늦었지만 에네드님의 첫 의견에 감사드리며, 이만 마치겠습니다.
여담이지만 Xo < Xn 이 항상인 만족하지 않는 경우가 있었습니다.
예를 들면 게임에서의 승률에 따라 랭킹을 매기는 경우입니다.
승률은 PlayWin(이긴횟수) / PlayN(플레이횟수) 계산이므로, 이전에 비해서 값이 커질 수도 있고 작아질 수도 있습니다.
이에 따라 Xo < Xn 인 경우에는 구현 2번 항목처럼 정렬을 진행하고, Xo > Xn 인 경우에는 Ub 그룹의 랭킹을 변화시켜야 하지요.
아울러 랭킹에서 동점자 처리시에 정렬 문제도 있는데요.
대부분 게임에서는 동점자일 경우 공동 순위를 매기기 보다는,
먼저 점수를 내는 플레이어에게 랭킹의 선순위를 매겨주지요.
그래서 정렬 기준에 마지막 점수를 달성한 날짜의 항목도 중요합니다.
이상 예전 경험에서의 짧은 소견이었습니다.