Skip to content

Conversation

@seoin2744
Copy link
Contributor

@seoin2744 seoin2744 commented Jan 19, 2026

Description

대회 종료 후 참가자별 상세 분석 데이터를 제공하는 Contest User Analytics Dashboard API 구현하였습니다. 해당 API들은 특정 대회의 전체 참가자 목록 조회 및 개별 참가자에 대한 세부 분석 데이터를 반환하여, 프론트엔드 데이터 시각화(패널티 분석, 문제 풀이 타임라인, 제출 기록 등)에 활용합니다.

<구현 기능>

1. 참가자 목록 조회 API

GET /contest/:contestId/statistics/users
대회의 전체 참가자 목록을 반환합니다.
ICPC 공식 규칙에 따라 풀이 수(solved DESC) → 패널티(penalty ASC) 기준으로 정렬된 순위 정보를 제공합니다.

반환 데이터

  1. userId
  2. username
  3. rank
  4. solved (해결한 문제 수)
  5. penalty (총 패널티)

적용된 로직

  • ICPC scoring 규칙에 따라 문제별 (해결 시각 + 오답 × 20분)을 모두 합산하여 사용자 패널티 계산
  • 종료되지 않은 대회 요청 시 403 에러 반환
  • 존재하지 않는 대회 요청 시 404 에러 반환

2. 참가자 상세 분석 API

GET /contest/:contestId/statistics/user/:userId
특정 사용자의 대회 성과를 상세하게 조회할 수 있는 API입니다.
프론트의 “사용자 분석(User Analytics)” 탭에서 사용하는 핵심 데이터입니다.

반환 정보 구성
(1) 기본 사용자 정보

  • rank
  • username
  • totalSolved
  • totalPenalty

(2) penaltyAnalysis (문제별 패널티 분석)
해결된(isSolved = true) 문제만 포함하며, 각 문제에 대해 다음 정보를 반환합니다:

  • problemLabel
  • attemptCount
  • wrongAttemptCount
  • successPenalty (해결 시각 기준)
  • wrongPenalty
  • problemPenalty (총 패널티)
  • 패널티 계산식은 ICPC 규칙을 그대로 따릅니다.

(3) timeline (문제 풀이 타임라인)
제출 기록을 기반으로 산출한 “문제 풀이 구간”을 반환합니다.

  • solvingStartTime : 이전 문제 정답 제출 시각 / 첫 문제는 00:00:00
  • solvingEndTime : 해당 문제의 AC 제출 시각
  • solvingDuration : End - Start (초/분 단위)
    *제출 기반 추정이므로 실제 풀이 시간과 완벽히 일치하지 않을 수 있음.

(4) submissionHistory (모든 제출 내역)
사용자의 전체 제출 기록을 시간순으로 반환합니다.

  • submissionTime
  • problemLabel
  • result
  • language
  • isSolved

@skkuding-bot
Copy link

skkuding-bot bot commented Jan 19, 2026

Syncing Preview App Succeeded

Application: frontend
Revision: 4107dc85a7ecffa69b3ca699212c3515aea26cb5
Health Status: Healthy

Open Preview | View in Argo CD

@seoin2744 seoin2744 closed this Jan 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants