🦉 뀨업 - 이화 백준 사이트 리팩토링 ( 9 ) - 학생별 기여도 순위 조회 API ( 1 )

2025. 3. 13. 00:17개발/🦉 뀨업

 

 

 

학생별 기여도 순위 조회 API를 만들어보쟈

여기서 기여도란 '이화여자대학교'의 백준 순위를 높이는 데에 기여한 정도를 의미한다!

 

 

<기여도 공식>

S(basic) = i=1 ∑ n​ (Ki)

n: 총 문제의 개수
Ki: 해당 문제(i)의 난이도 점수
K => Bronze V는 1점, Bronze IV는 2점, ..., Ruby I는 30점
S(rare​) = i=1 ∑ n​ (K * e ^(− λ*Ni​))

n: 총 문제의 개수
K: 기본 가중치 ( 10 )
λ: 감소율 (0.02)
Ni​: 문제 i를 푼 사람 수 
S(total​) = S(basic​) + S(rare​)

 

S(basic) : 푼 문제의 개수와 푼 문제의 난이도를 기준으로 계산한 식

S(rare) : 희소성 가중치 - 특정 문제를 푼 이화인이 적을수록 가중치 증가

 

 


 

 

사용할 Table 

이화여대 학생 백준 아이디 푼 백준 문제 번호
   

 

백준 문제 번호 푼 이화여대 학생 백준 아이디
   

 

DynamoDB 사용할 예정...!

 

 

방법 1.  Solved.ac API 사용하기

 

'문제 수준별로 사용자가 푼 문제 수 가져오기' API

https://solvedac.github.io/unofficial-documentation/#/operations/getUserProblemStats  

 

@solvedac/unofficial-documentation

이 프로젝트는 solved.ac API를 문서화하는 커뮤니티 프로젝트입니다. 이 저장소는 원작자의 요청에 따라 언제든 지워질 수 있으며, 현재 API와 일치하지 않을 수도 있는 점 양해 부탁드립니다.

solvedac.github.io

Parameter로 백준 핸들 넣어서 요청하면 티어별로 사용자가 푼 문제 개수를 구할 수 있다

문제 번호 하나하나 받아오고 다시 그 개수를 구하기 보단 이게 훨씬 빠를 것 같다

 

이걸 이용하면 S(basic)은 쉽게 구할 수 있을 건데...

므악 S(rare)를 까먹었답...

S(rare)값은 문제별로 푼 이화인 수를 구해야 하기 때문에

어차피 문제 번호 하나하나 다시 받아와야 해서 이중작업이 될 듯하다...

흠 기각 (혹은 보류...)

 

 

방법 2.  크롤링할 때 DynamoDB에 넣는 로직 추가

 

현재 하루에 한번 DB를 갱신해주는데

이때 각각의 이화여대 학생이 푼 백준 문제를 불러온다

이 로직을 수행할 때 DynamoDB를 갱신해주는 로직을 추가하면 되지 않을까 싶다

 

그리구 모오든 갱신이 완료되었을 때 기여도 계산!

훔 이게 최선인 둣

 

나중에 백준 문제 풀이에 대한 동기 부여를 늘리기 위해... 월별/주별 기여도 조회도 만들어봐야겠당