BOJ 서비스 종료 이후, 동아리에서 진행했던 대회와 문제를 Polygon 패키지 기준으로 정리해 보여주는 정적 아카이브 사이트입니다.
이 저장소는 다음 정보를 웹에서 확인할 수 있도록 구성되어 있습니다.
- 대회 목록
- 대회별 기본 정보
- 대회별 문제 목록
- 문제별 지문, 제한, 예제
- 문제별 출제자 / 검수자
- 대회별 첨부파일
이 프로젝트는 별도 백엔드 없이 동작하는 정적 사이트입니다.
- 메인 페이지: 대회 목록
- 대회 페이지: 대회 정보, 문제 목록, 첨부파일
- 문제 페이지: BOJ 스타일 문제 보기
대회 원본 데이터는 contests/contest-XXXXX 형태의 Polygon package 폴더에서 읽습니다.
저장소 루트에서 정적 파일 서버를 실행한 뒤 브라우저로 접속하면 됩니다.
예시:
python3 -m http.server 5173접속 주소:
http://127.0.0.1:5173/
주의:
file:///...로 직접 열면fetch기반 로딩이 동작하지 않습니다.- 첨부파일 목록은
attachments/디렉터리의 directory listing을 읽는 방식입니다. 따라서 배포 환경에서도 디렉터리 listing을 허용하는 정적 서버를 사용하는 것이 좋습니다.
이 프로젝트는 정적 파일만으로 구성되어 있으므로 일반적인 정적 호스팅에 배포할 수 있습니다.
예:
- Nginx
- Apache
- Caddy
- 간단한 Python 정적 서버
배포 시 필요한 것은 저장소 전체 파일과 contests/ 아래의 대회 데이터입니다.
기본 구조는 아래와 같습니다.
.
├── index.html
├── contest.html
├── problem.html
├── app.js
├── detail.js
├── problem.js
├── data.js
├── contest-problems.js
├── math-render.js
├── styles.css
└── contests
├── index.json
├── contest-35823
├── contest-40677
└── contest-XXXXX
새 대회를 추가할 때는 Polygon에서 받은 contest package를 contests/contest-XXXXX 형태로 넣고, 메타데이터 파일을 같이 작성하면 됩니다.
예시:
contests/
contest-51484/
contest.xml
problems/
statements/
여기서 contest-51484 같은 폴더명은 자유롭게 정할 수 있지만, 일반적으로 Polygon contest id를 그대로 사용하는 것을 권장합니다.
대회 목록에 보이게 하려면 contests/index.json에 폴더명을 추가해야 합니다.
예시:
[
"contest-10001",
"contest-10002",
"contest-10003"
]주의:
- 값은 실제 폴더명과 정확히 같아야 합니다.
- 화면 정렬은 배열 순서가 아니라
archive-info.json의openedAt기준 내림차순으로 다시 정렬됩니다.
각 대회 폴더에는 반드시 archive-info.json이 있어야 합니다.
경로:
contests/contest-XXXXX/archive-info.json
예시:
{
"slug": "sample-contest",
"name": "2025 Sample Contest",
"openedAt": "2025-01-01T13:00:00+09:00",
"displayDateTime": "2025.01.01 13:00 ~ 17:00",
"onsiteParticipants": 12,
"onlineParticipants": 34,
"venue": "예시 장소",
"duration": "4시간",
"description": "예시 대회 설명"
}필드 설명:
slug: 대회 URL 식별자. 대회마다 유일해야 함name: 화면에 표시할 대회 이름openedAt: 정렬 기준 시각displayDateTime: 화면에 보여줄 날짜/시간 문자열onsiteParticipants: 온사이트 참가자 수onlineParticipants: 온라인 참가자 수venue: 진행 장소duration: 진행 시간description: 대회 설명
현재 사이트는 아래 구조를 기준으로 문제 데이터를 읽습니다.
contests/contest-XXXXX/
contest.xml
problems/
<problem-id>/
problem.xml
statement-sections/
korean/
name.tex
legend.tex
input.tex
output.tex
notes.tex
example.01
example.01.a
statements/
korean/
statements.tex
필수로 쓰이는 파일:
contest.xmlstatements/korean/statements.texproblems/<problem-id>/problem.xmlproblems/<problem-id>/statement-sections/korean/name.texproblems/<problem-id>/statement-sections/korean/legend.texproblems/<problem-id>/statement-sections/korean/input.texproblems/<problem-id>/statement-sections/korean/output.tex
선택 파일:
notes.texexample.01,example.01.a,example.02,example.02.a등 예제 파일- 지문에서 참조하는 이미지 파일
대회에서 실제로 보여줄 문제와 순서를 직접 지정하는 파일입니다.
경로:
contests/contest-XXXXX/problem-order.txt
형식:
- 한 줄에 problem id 하나씩 작성
- 적은 순서대로 A, B, C, ... 가 다시 부여됨
- 파일이 없으면
statements.tex의 순서를 그대로 사용
예시:
problem-a
problem-b
problem-c
problem-d
주석도 지원합니다.
# one problem-id per line
problem-a
problem-b
문제별 출제자 / 검수자 정보를 넣는 파일입니다.
경로:
contests/contest-XXXXX/problem-credits.json
예시:
{
"problem-a": {
"출제자": "author1",
"검수자": "reviewer1, reviewer2"
},
"problem-b": {
"출제자": "author2",
"검수자": ""
}
}규칙:
- key는 반드시 problem id와 같아야 합니다.
- 값이 비어 있으면 화면에 표시되지 않거나 빈 값으로 처리됩니다.
대회 첨부파일을 보여줄 폴더입니다.
경로:
contests/contest-XXXXX/attachments/
예시:
contests/
contest-10001/
attachments/
notice.pdf
poster.png
- 폴더가 있으면 대회 페이지 하단에 첨부파일 목록이 표시됩니다.
- 파일 클릭 시 새 탭에서 열립니다.
문제 지문에서 참조하는 그림 파일은 보통 statement-sections/korean/ 아래에 같이 두면 됩니다.
예시:
problems/problem-a/statement-sections/korean/
legend.tex
figure-1.png
figure-2.jpg
지문에서는 아래처럼 사용할 수 있습니다.
\begin{center}
\begin{tabular}{cc}
\includegraphics[scale=0.4]{figure-1.png} &
\includegraphics[scale=0.4]{figure-2.jpg} \\
\end{tabular}
\normalsize{설명 문장}
\end{center}현재 렌더러가 처리하는 대표 문법:
\begin{itemize} ... \end{itemize}\begin{enumerate} ... \end{enumerate}\begin{center} ... \end{center}\begin{tabular} ... \end{tabular}\includegraphics\href,\url\texttt,\mathtt,\textbf,\textit,\emph\small,\footnotesize,\scriptsize,\normalsize
slug는 URL 식별자이므로 중복되면 안 됩니다.problem-order.txt에 적지 않은 문제는 대회 페이지에서 숨겨집니다.- 문제 ID는 Polygon 패키지 내부 폴더명과 정확히 같아야 합니다.