🟥 왜 만들었어?
알고리즘 스터디를 진행하면서 매일마다 문제를 정해주는 게 꽤 번거로운 일이 될 것 같아서
이 과정을 자동화하고자 하였다.
🟧 어떻게 만들려고 해?
1. 문제 사이트에서 Level별로 정렬을 하고
2. 랜덤으로 문제를 선정한뒤에
3. 문제가 한국어인지 확인한다.
3-1. 만약 한국어가 아니면 2번으로 돌아간다.
🟨 Level별로 정렬은 어떻게 했어?
먼저 solved.ac에서 다음과 같은 Level에 따른 문제를 보여주는 사이트가 있었다.
https://solved.ac/problems/level/1?page=1
여기서 level/{level_value}?page={page_number}가 중요한데,
level_value는 0부터 30까지
Unrated, Bronze V, Bronze IV, ... , RUBY II, RUBY I과 연결되어 있다.
그래서 Silver I 문제를 확인하고자 한다면 level_value에 10이라는 값을 넣으면 된다.
🟩 랜덤으로 문제 선정은 어떻게 했어?
위의 사이트에서 랜덤으로 문제 번호만 가져온 뒤 하나를 선택해 준다.
그렇다면 page_number는 무엇이었나?
저 사이트는 문제를 50개씩 보여준다.
특정 Level의 문제 개수가 152개면 Page는 50+50+50+2이므로 4페이지까지 있는 것이다.
아무튼 Level마다 문제 개수가 다르니까 랜덤으로 문제를 선정할 때 maxPageNumber를 알아야 할 것 같았다.
그러던 중에 sovled.ac의 API 비공식 문서를 발견했다.
https://solvedac.github.io/unofficial-documentation/#/
그래서 레벨 별로 문제 개수를 알 수 있는 API를 발견하였고(https://solved.ac/api/v3/problem/level)
문제 개수를 50으로 나눈 몫에 올림 함수를 적용하여 Page개수를 구할 수 있었다.
🟦 한국어인지 어떻게 확인했니?
https://solved.ac/api/v3/problem/show?problemId={problemNumber}에 들어가면
titles값이 있는데 거기에 첫 번째 language값이 ko가 아니면 한국어 문제가 아닌 걸로 판단했다.
1) 한글인 경우
{"problemId":10211,"titleKo":"Maximum Subarray","titles":[{"language":"ko","la...
2) 영어인 경우
{"problemId":29779,"titleKo":"Colliding Encoding","titles":[{"language":"en","la...
🟪 결과
결국 내 프로그램은 계획한 대로 작동했다!
태그도 가져오게끔 만들었다.
하지만 또 다른 문제가 발생하고 마는데...
'💻 소프트웨어(SW) > 혼자 만든 프로젝트' 카테고리의 다른 글
[백준] 자동으로 문제 선정해서 가져오기 - 2 (1) | 2024.02.09 |
---|---|
랭킹 알고리즘[Ranking Algorithm]을 어떻게 해볼까 (0) | 2023.11.11 |