Skip to content

Repository files navigation

KPSC Archive

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 형태로 넣고, 메타데이터 파일을 같이 작성하면 됩니다.

1. Polygon package 폴더 추가

예시:

contests/
  contest-51484/
    contest.xml
    problems/
    statements/

여기서 contest-51484 같은 폴더명은 자유롭게 정할 수 있지만, 일반적으로 Polygon contest id를 그대로 사용하는 것을 권장합니다.

2. contests/index.json에 등록

대회 목록에 보이게 하려면 contests/index.json에 폴더명을 추가해야 합니다.

예시:

[
  "contest-10001",
  "contest-10002",
  "contest-10003"
]

주의:

  • 값은 실제 폴더명과 정확히 같아야 합니다.
  • 화면 정렬은 배열 순서가 아니라 archive-info.jsonopenedAt 기준 내림차순으로 다시 정렬됩니다.

3. archive-info.json 작성

각 대회 폴더에는 반드시 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: 대회 설명

Polygon package에서 읽는 필수 파일

현재 사이트는 아래 구조를 기준으로 문제 데이터를 읽습니다.

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.xml
  • statements/korean/statements.tex
  • problems/<problem-id>/problem.xml
  • problems/<problem-id>/statement-sections/korean/name.tex
  • problems/<problem-id>/statement-sections/korean/legend.tex
  • problems/<problem-id>/statement-sections/korean/input.tex
  • problems/<problem-id>/statement-sections/korean/output.tex

선택 파일:

  • notes.tex
  • example.01, example.01.a, example.02, example.02.a 등 예제 파일
  • 지문에서 참조하는 이미지 파일

선택 메타데이터 파일

problem-order.txt

대회에서 실제로 보여줄 문제와 순서를 직접 지정하는 파일입니다.

경로:

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

problem-credits.json

문제별 출제자 / 검수자 정보를 넣는 파일입니다.

경로:

contests/contest-XXXXX/problem-credits.json

예시:

{
  "problem-a": {
    "출제자": "author1",
    "검수자": "reviewer1, reviewer2"
  },
  "problem-b": {
    "출제자": "author2",
    "검수자": ""
  }
}

규칙:

  • key는 반드시 problem id와 같아야 합니다.
  • 값이 비어 있으면 화면에 표시되지 않거나 빈 값으로 처리됩니다.

attachments/

대회 첨부파일을 보여줄 폴더입니다.

경로:

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 패키지 내부 폴더명과 정확히 같아야 합니다.

About

KPSC, 혹은 연합해서 주최한 대회들의 지문, 데이터를 아카이브 하는 프로젝트

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages