목차
- Project-PS란?
- PPS의 주요 기능
- GNB(Global Navigation Bar)
- 회원 가입
- 문제 풀기
- 문제 제작
- 문제 제작 With Github
이 글과 연관된 글
- 패치 노트
- 과거 버전
- 채점 서버 사양 및 컴파일 옵션
- 채점 결과 및 원인
- 문제 타입
- 지문 작성 가이드
- 정답 체커 작성 가이드
- 데이터 제네레이터 작성 가이드
- 밸리데이터 작성 가이드
- PPS 권한 관리
Project-PS란?
Project PS 이하 PPS는 현재 문제 생성, 테스트, 채점, 문제 배포, 대회 진행 등 문제를 만들어 배포하고, 대회까지 진행할 수 있는 Online Judge 플랫폼입니다.
현재 시중에 많은 Online Judge가 나와있습니다. 하지만, 문제를 만드는 기능과 대회를 자유롭게 열 수 있는 기능이 모두 존재하는 Online Judge는 없다고 생각되어 직접 만들게 되었습니다.
사실 불편함 보다는 개인적인 공부 목적과 나중에 확장 가능한 큰 프로젝트를 만들고 싶어 시작하게 되었습니다. :)
PPS의 주요 기능
- 문제 풀기(채점) 및 결과 확인
- 문제 만들기 및 테스트
- 대회 운영
GNB(Global Navigation Bar)
현재 PPS의 GNB는 다음과 같이 구성되어 있습니다.
- Logo: PPS의 로고입니다. 클릭하면 메인 페이지로 이동합니다.
- 문제: PPS에 등록된 모든 문제를 볼 수 있습니다.
- 문제 저장소: PPS에 등록된 모든 저장소를 볼 수 있습니다.
- 대회: PPS에 등록된 모든 대회를 볼 수 있습니다.
- 카테고리: PPS에 등록된 모든 카테고리를 볼 수 있습니다.
- ”+”: 문제, 팀, 대회 등 PPS에 무언가를 만들 수 있습니다.
- 닉네임: 사진 상에는 닉네임이
Rn
입니다. 클릭하면 프로필 페이지로 이동합니다. - 설정: 유저 설정을 변경할 수 있습니다.
- 로그아웃: 로그아웃합니다.
문제 저장소란, 문제를 만들 때 필요한 모든 파일을 저장하는 공간입니다. 문제 저장소가 공개되어 있는 문제는 문제의 정답 코드 혹은 데이터 제네레이터 등 문제를 만드는 데 필요한 모든 정보를 확인할 수 있습니다.
PPS는 내부적으로 Github를 문제 저장소로 이용하고 있습니다. 따라서 PPS 웹 사이트에서 문제를 확인하기 위해서는 PPS 설정 페이지에서 Github와 연동해야 합니다. 혹은 github.com/PPS-REPO에 직접 접근해서 확인해도 됩니다.
또, 문제 저장소가 공개되어 있는 경우 현재는 Github를 통해 문제에 기여할 수도 있습니다.
회원 가입
PPS에 회원가입하기 위해서는 다음 네 가지 정보를 기입해야 합니다.
- 이메일: 현재 특별히 사용되는 부분은 없습니다. 다만, 추후 이메일을 이용한 여러 기능이 추가될 예정입니다.
- 닉네임: PPS에서 보일 이름입니다. 다른 사이트에서 사용하는 핸들(아이디)이라고 생각하면 됩니다. 현재는 닉네임을 변경하는 방법이 존재하지 않으므로, 신중하게 정하시길 바랍니다.
- 아이디: 로그인을 위해 필요한 정보입니다. 로그인 외에 어떤 곳에서도 사용되지 않습니다. 대소문자를 구분하지 않습니다.
- 비밀번호: 로그인을 위해 필요한 정보입니다. 로그인 외에 어떤 곳에서도 사용되지 않습니다. 대소문자를 구분합니다.
문제 풀기
문제를 풀기 위해서는 상단에 모든 문제 탭에 들어가면 됩니다.
맞은 문제는 초록색
, 틀린 문제는 빨간색
, 아직 풀지 않은 문제는 흰색
으로 표시됩니다.
문제 제목(a + b
, a - b
등)을 클릭하면 문제를 풀 수 있는 페이지로 이동합니다.
왼쪽 끝에는 문제 번호가 표기됩니다. 가운데는 문제 제목과 문제를 만든 계정의 닉네임이 표기됩니다. 닉네임을 클릭하면, 해당 계정의 프로필 페이지로 이동합니다.
지문
문제 페이지에 들어가면 다음과 같은 화면이 나오게 됩니다.
한 문제에 대해서 여러 타입의 지문이 존재할 수 있습니다. 지문 선택 버튼을 누르면 다음과 같이 다른 타입의 지문을 선택할 수 있습니다.
단, 지문이 하나만 존재하는 경우엔, 표기되지 않을 수 있습니다.
다른 타입의 지문을 선택하면 다음과 같이 지문이 변경됩니다.
지문에는 문제를 풀기 위한 정보가 쓰여 있습니다. 지문을 읽고 문제를 풀어주시면 됩니다. 지문 아래에는 문제를 풀기 위해 도움을 주는 예제가 주어집니다.
예제를 모두 맞는다고 해서 문제를 맞은 것은 아닙니다. 실제 채점 시에는 예제를 포함해 숨겨진 테스트 케이스로 채점됩니다.
지문의 아래쪽에는 다음 사진과 같이 문제가 속해있는 카테고리와, 언어별 시간, 메모리 제한이 주어집니다.
카테고리에 포함되어 있지 않은 경우 카테고리는 표기되지 않을 수도 있습니다.
제출(채점)
지문을 보고 문제를 풀었다면, 작성한 코드가 맞았는지 틀렸는지 실시간으로 채점받을 수 있습니다. 지문 상단에 코드 제출 탭으로 들어가면 다음 페이지가 나오게 됩니다.
이후 다음과 같이 제출할 언어를 선택할 수 있습니다. 코드를 제출하기 전에 내가 제출하려는 언어의 버전과 일치하는지 꼭 확인해야 합니다.
문제를 풀기 위한 코드를 작성한 뒤, 제출 버튼을 누르면 채점받을 수 있습니다.
채점 버튼을 누르면 자동으로 내 채점 현황 페이지로 이동하게 됩니다.
채점 현황
채점 요청을 요청한 상태라 채점 대기 중
표시가 되어있습니다. 채점 요청이 되면, 채점 서버에서 요청이 들어온 순서대로 채점을 진행합니다. (현재는 자동으로 채점 현황을 업데이트해주지 않아 임의로 새로고침해야 합니다.)
채점이 시작되어 화면에 채점 중
이 표시되었습니다. 채점이 완료되면 다음과 같이 결과가 바뀝니다.
채점이 완료되어 결과가 표시됐습니다. 현재의 경우 지문에 존재하는 예제와 숨겨진 채점 데이터가 모두 맞아 맞았습니다
라고 표기되어 있습니다. 지문에 있는 예제가 맞더라도 숨겨진 채점 데이터에서 올바르지 않은 답을 출력한다면, 다른 결과가 나올 수 있습니다.
채점 결과로 나올 수 있는 모든 결과는 여기에서 확인할 수 있습니다.
제출한 코드 보기
내 채점 현황
혹은 채점 현황
에서 내가 제출했던 코드를 확인할 수 있습니다.
채점 현황에서 제출 로그 오른쪽에 보이는 아이콘에 마우스를 올리면 제출한 언어의 버전이 표시됩니다. 이후 아이콘을 클릭하게 되면, 다음과 같이 제출한 코드를 확인할 수 있는 페이지로 이동합니다.
모든 사람의 코드를 확인할 수 있는 것은 아니고, 내가 제출한 코드 혹은 내가 맞은 문제에 제출한 다른 사람의 코드만 확인할 수 있습니다.
문제 제작
PPS에서는 문제를 제작하고 테스트할 수 있는 툴을 제공합니다.
Github를 저장소로 사용하여 PPS계정과 Github계정을 연동하고 PPS를 통해 문제를 제작할 수 있습니다. 또, Github를 이용해 로컬에서 작업할 수 있는 환경도 구성할 수 있습니다.
이 문서에서는 두 가지 방법 모두 설명하고 있습니다.
문제 채점 프로세스
문제 제작 프로세스를 설명하기에 앞서 문제 채점 프로세스를 알아야 합니다.
문제 채점 프로세스는 다음과 같이 진행됩니다.
- 응시자가 코드 작성 및 제출
- 채점 서버에서 응시자 코드를 실행
2-1. 코드 실행 시 입력은 문제 제작 시 만들어놓은 모든 테스트 케이스를 순차적으로 입력합니다.
2-2. 따라서 테스트 케이스 개수만큼 실행됩니다. - 응시자 코드를 실행해서 나온 결과 받아오기
- 정답 체커(채점 코드) 실행하기
4-1. 정답 체커에는 3번에서 나온 응시자의 출력 결과와 문제 제작 시 만들어놓은 테스트 케이스를 전달합니다.
4-2. 응시자의 출력과 테스트 케이스를 기반으로 정답 혹은 오답을 산출합니다. - 정답 체커에서 반환한 값을 토대로 채점을 마무리하고 결과 반영
따라서 필수로 필요한 부분은 다음과 같습니다.
- 정답 코드
- 채점 코드
- 테스트 케이스 (정답 데이터)
인보케이트 & 배포(문제화) 프로세스
문제 제작 프로세스를 설명하기에 앞서 어떤 방식으로 문제가 만들어지고 사람들이 풀 수 있게 배포되는지 알아야 합니다.
인보케이트와 배포를 진행했을 때 공통으로 실행되는 프로세스는 다음과 같습니다.
- 특정 문제에 대해 인보케이트, 배포 요청
- 특정 조건에 어긋나는 설정이 있는지 확인 (매우 큰 시간 제한 등)
- 설정 데이터 불러오기 (시간 제한 등)
- 데이터 제네레이터 실행 (입력 데이터 제작)
- 입력 검증(밸리데이터) 실행 (입력 데이터가 조건에 맞는지 확인) - 입력 검증 코드가 없다면 실행하지 않음
- 입력 데이터를 가지고 MCS(Main Correct Solution) 실행 (출력 데이터 제작)
- 4, 6번 과정에서 생성된 입출력 데이터를 가지고 등록된 다른 모든 솔루션 실행
- 실행한 결과를 가지고 체커를 통해 결과 분석
- 다음 프로세스 실행
위와 같이 실행된 뒤 인보케이트의 경우 다음 프로세스를 진행합니다.
- 모든 솔루션이 실행된 결과를 저장 (이때, 의도에 맞지 않는 결과가 나와도 실행된 결과를 확인할 수 있습니다. ex. 오답 솔루션이 정답이 나옴 등)
- 인보케이트 결과 반영 (모든 솔루션이 의도에 맞게 동작했는지 여부)
만약 프로세스가 중간에 중단됐다면 솔루션 결과가 나오지 않을 수도 있습니다. ex. 데이터 제네레이터가 실행 중 오류로 프로세스 중단
배포(문제화)의 경우 다음 프로세스를 진행합니다.
- 모든 솔루션이 의도에 맞게 동작했다면, 유저들이 풀 수 있는 문제로 업로드
- 이미 업로드된 문제라면 업데이트
- 이후 배포 결과 반영 (모든 솔루션이 의도에 맞게 동작했는지 여부)
여기서 말하는 모든 솔루션의 의도에 맞는다 라는 뜻은, 정답이 나와야 하는 솔루션이 정답이 나오고, 오답이 나와야 하는 솔루션은 오답이 나왔음을 의미합니다. 자세한 설명은 뒤에서 다룹니다.
문제 제작 프로세스
문제 제작은 다음 프로세스를 통해 진행됩니다. 이 파트에서는 각 프로세스 별 실제 작성 방법까지 다루지는 않습니다. 진행 프로세스만 이해하고 다음 파트로 넘어가서 실제 작성 방법을 다룹니다.
- 아이디에이션
- 지문 작성
- 정답 & 오답 솔루션 작성
- 정답 체커 (채점 코드) 코드 작성
- 데이터 제네레이터 코드 작성
- 데이터 제네레이터를 호출해서 데이터를 만드는 genscript 작성
- [선택] 입력 검증 코드 작성
- 의도한 결과가 나오는지 테스트 (인보케이션)
- 배포 (문제화)
2~6번 과정은 순서는 중요하지 않습니다. 편한 순서대로 작업하면 됩니다.
아이디에이션
문제의 아이디어를 떠올리는 과정입니다.
어떤 컨셉과 어떤 방향성으로 문제를 제작할지 구상하는 단계로, 무언가 정해진 프로세스는 없습니다. 본인이 떠오르는 방법대로 아이디어를 구상하는 단계입니다.
지문 작성
떠올린 아이디어를 지문으로 작성하는 과정입니다.
사람들이 문제를 풀 수 있게 문제에 관련된 사항을 자세하게 적으면 됩니다.
정답 & 오답 솔루션 코드 작성
문제의 정답 코드와 오답 코드를 작성하는 과정입니다.
오답 코드를 필수로 작성할 필요는 없지만, 작성하는 것을 강력하게 권장합니다.
정답 코드는 말 그대로 문제에서 의도한 결과를 내는 정답 코드입니다.
오답 코드는 정답이 나오면 안 되는 결과를 뜻합니다. 응시자가 실수할 수 있는 부분을 오답 코드로 작성하면 됩니다.
오답 코드를 작성했을 경우, 데이터를 제작한 뒤, 오답 코드가 실제로 오답이 나오는지 혹은 나오지 않는지 테스트(인보케이트) 과정에서 알 수 있습니다.
정답 체커 (채점 코드) 코드 작성
응시자의 실행 결과 (출력), 테스트 케이스 입력, 테스트 케이스 출력을 가지고 정답인지 혹은 오답인지를 판단하는 코드를 작성하는 과정입니다.
데이터 제네레이터 코드 작성
입력 데이터를 생성하는 코드를 작성하는 과정입니다.
출력 데이터는 정답 솔루션을 통해 자동으로 생성되므로, 입력 데이터만 생성하면 됩니다.
데이터 제네레이터는 한 번 실행될 때마다 입력 한 개를 만들게 됩니다. 따라서 데이터 제네레이터를 작성해 놓고 genscript를 통해서 실제 데이터를 여러 개 만들게 됩니다.
데이터 제네레이터를 호출해서 데이터를 만드는 genscript 작성
데이터 제네레이터를 호출해서 실제 데이터를 만드는 과정입니다.
위에서 말했듯 데이터 제네레이터는 한 번 실행할 때마다 입력 데이터 하나만 만들게 됩니다.
따라서, 데이터 제네레이터를 가지고 데이터를 만들기 위해서는 데이터 제네레이터를 여러 개 작성하는 것이 아닌, genscript를 통해 데이터를 여러 개 만들게 됩니다.
예를 들어, n을 입력받아서 0 ~ n 사이 값 중 랜덤으로 입력 데이터를 만들어주는 데이터 제네레이터를 만들었다고 가정해 보겠습니다.
이때 n = 10
, n = 100
, n = 1000
인 세 데이터를 만드려고 한다면, 제네레이터를 세 개 작성하는 것이 아닙니다.
제네레이터는 하나만 작성해 놓고 generator n = 10
, generator n = 100
, generator n = 1000
과 같이 genscript를 작성하면 PPS에서 내부적으로 제네레이터를 실행해 데이터를 생성하게 됩니다.
자세한 설명은 뒤 파트에서 다룹니다.
[선택] 입력 검증 코드 작성
데이터 제네레이터에서 생성한 데이터가 문제 조건에 맞는지 확인하는 코드를 작성하는 과정입니다.
필수는 아니지만, 필수로 작성하는 것을 강력히 권장합니다.
의도한 결과가 나오는지 테스트 (인보케이션)
위 코드들을 모두 작성했다면 정답, 오답 솔루션이 각각 정답 혹은 오답이 잘 나오는지 확인하는 과정입니다.
실행한 솔루션이 각 테스트 케이스 별로 어떤 결과가 나왔는지 시간, 메모리가 얼마나 사용됐는지 등을 보여줍니다.
인보케이션을 진행한 결과를 보고 의도에 맞게 시간 및 메모리를 적절하게 수정해 주면 됩니다.
만약 솔루션이 의도한 결과가 나오지 않았다면 원인을 분석해서 해결하면 됩니다.
배포 (문제화)
모든 테스트가 끝났다면, 유저들이 풀 수 있게 문제를 등록하는 과정입니다.
배포를 진행하게 되면, 권한이 있는 다른 유저들이 문제에 접근하고 문제를 풀어볼 수 있습니다.
PPS계정에 Github계정 연동하기
먼저, 문제를 제작하기 위해선 PPS계정과 Github계정을 연동해야 합니다.
설정 > Github 페이지에 들어가서 Github에 연동할 수 있습니다.
설정 페이지에 들어갔을 때 연동이 되지 않은 경우 위와 같이 보이게 됩니다.
Github 계정 연동하기 버튼을 눌러 다음 절차를 통해 연동하면 됩니다.
- Github 계정 로그인 하기. (Github계정이 없다면 가입해야 합니다.)
- Authorize Project PS App 버튼 클릭하기
이렇게 하면 다음과 같이 계정이 연동됩니다.
문제 레포지토리 생성하기
PPS에서는 Github를 저장소로 사용합니다. 따라서 문제를 만들기 위해선 Github Repository를 만들어야 합니다.
문제
혹은 문제 저장소
탭의 우측 상단에 존재하는 문제 만들기
버튼을 클릭하거나, 상단의 +
버튼을 눌러서 문제 만들기
를 클릭하면 됩니다.
문제 만들기
를 누르면 다음과 같은 화면이 나오게 됩니다.
문제를 만들기 위해 기입해야 하는 정보는 다음과 같습니다.
- 템플릿 사용 여부: 템플릿 레포지토리를 이용해서 문제를 생성합니다. 특별한 이유가 없다면 템플릿을 사용하는 것을 강력추천 합니다. 템플릿 레포지토리에 기본 정답 체커 등 문제 제작에 필요한 기본적인 파일이 모두 들어있기 때문입니다.
- 문제 제작자: 자신의 계정을 제작자로 할지 혹은 자신이 속한 팀을 제작자로 할지 선택해야 합니다. 사람들이 문제를 볼 때 여기서 선택한 계정이 제작자로 공개됩니다. 또, 팀을 제작자로 선택했을 경우 팀에 속한 권한이 있는 사람이 문제를 보거나 수정할 수 있습니다.
- 레포지토리 이름: 깃허브에 생성할 레포지토리 이름입니다. PPS계정별로 고유한 이름을 가져야 합니다. 문제 저장소 리스트에 표기되는 이름입니다. 영어 알파벳,
-
,_
만 사용할 수 있습니다. - 레포지토리 설명: 레포지토리 설명에 표기될 설명입니다.
- 레포지토리 공개 여부: 공개 설정을 하면, 모든 유저가 정답 코드와 데이터 등을 열람할 수 있습니다. 비공개한다면 권한이 있는 사람만 열람할 수 있습니다.
- 문제 공개 여부: 공개 설정을 하면, 모든 유저가 문제를 풀어볼 수 있습니다. 비공개한다면, 권한이 있는 사람만 문제를 풀어볼 수 있습니다.
위 내용을 모두 기입하고 레포지토리 생성하기
버튼을 클릭하면 레포지토리가 생성되고, 해당 레포지토리를 수정할 수 있는 페이지로 이동합니다.
문제 목록
생성한 레포지토리는 문제 저장소
탭에서 확인할 수 있습니다.
문제 제작하기 - Information Box
레포지토리로 이동하게 되면, 상단에 다음과 같은 정보가 표기됩니다.
- 문제 고유 아이디: 이 문제에서는
44
가 고유한 아이디입니다. - 레포지토리 이름: 이 이 문제의 레포지토리 이름은
guide
입니다. - 문제 제목: 레포지토리 이름이 아닌 문제의 제목입니다. 템플릿을 이용해서 생성했기 때문에 현재
a + b
로 설정되어 있습니다. - 문제 타입: 문제의 타입입니다. 문제 타입에 대한 자세한 정보는 여기에서 확인할 수 있습니다.
- 지문: 유저에게 가장 먼저 보일 지문의 파일 이름입니다.
- 정답 체커: 채점 코드로 선택된 파일 이름입니다.
- 입력 검증: 생성된 input 데이터를 검증해 줄 파일 이름입니다.
- 시간 제한: 채점할 프로그램의 실행 시간 제한입니다.
- 메모리 제한: 채점할 프로그램의 메모리 제한입니다.
- Github 열기: 현재 레포지토리를 저장하고 있는 Github로 이동합니다.
- 인보케이트: 현재 레포지토리를 인보케이션(테스트)합니다. 자세한 설명은 뒤에 있습니다.
- 배포: 현재 레포지토리를 배포(문제화)합니다. 자세한 설명은 뒤에 있습니다.
문제 제작하기 - NB (Navigation Bar)
문제 제작 페이지에서는 여러 하위 페이지들이 존재합니다. 다음과 같이 Navigation Bar를 통해 페이지를 이동할 수 있습니다.
- 전체 설정: 문제 제목이나 시간 제한 등 메타데이터를 설정하는 페이지입니다.
- 언어별 제한: 시간, 메모리 제한을 언어별로 설정할 수 있는 페이지입니다.
- 지문: 지문을 작성하는 페이지입니다.
- 솔루션: 정답 코드를 작성하는 페이지입니다.
- 정답 체커: 채점 코드를 작성하는 페이지입니다.
- 데이터 제작: input 데이터를 제작하는 페이지입니다.
- 입력 검증: 데이터 제작에서 만든 데이터를 검증하는 코드를 작성하는 페이지입니다.
- 인보케이트: 기존에 인보케이션(테스트) 했던 결과를 확인할 수 있는 페이지입니다.
- 배포: 배포(문제화)했던 결과를 확인할 수 있는 페이지입니다.
- 권한 관리: 문제에 접근 권한을 줄 수 있는 페이지입니다.
문제 제작하기 - 전체 설정
문제 제목이나 시간 제한 등 메타데이터를 설정하는 페이지입니다.
문제 제목은 사람들에게 보일 제목입니다. 1글자 이상 50글자 이하로 구성해야 합니다.
문제 타입은 현재 STDIO
만 지원하고 있습니다. 자세한 정보는 여기에서 확인할 수 있습니다.
시간 제한은 Milli Second 단위로 작성하면 됩니다. 0.1 SEC ~ 5 SEC 사이로 설정해야 합니다. (1000 MS = 1 SEC)
메모리 제한은 Byte단위로 작성하면 됩니다. 4 MiB ~ 1024 MiB 사이로 설정해야 합니다. (1 MiB = 1024 * 1024 Byte)
제출 가능 언어는 문제에 제출할 수 있는 언어를 제한하는 기능입니다. 현재는 지원하고 있지 않아서, 선택할 수 없습니다.
원하는 설정으로 변경한 뒤 저장
버튼을 누르면 됩니다.
문제 제작하기 - 언어별 제한
시간, 메모리 제한을 언어별로 설정할 수 있는 페이지입니다.
오른쪽 리스트에 있는 언어들은 언어별 제한을 걸지 않는다(기본으로 결정되는 언어별 제한을 사용한다)는 뜻입니다.
왼쪽 리스트에 있는 언어들은 해당 언어에 언어별 제한을 설정하겠다는 의미입니다. 이때, 0을 넣게 되면 기본으로 결정되는 언어별 제한을 따르겠다는 의미입니다.
따라서, 위 그림에서는 Python3
에 대해서만 제한을 임의로 설정하고, 그 외 언어들에 대해서는 기본으로 결정되는 언어별 제한을 사용한다는 의미입니다.
또, Python3
에 대해 시간 제한은 기본으로 결정되는 언어별 제한을 사용하고, 메모리 제한은 256 MiB (= 268435456 Byte)로 강제하겠다는 의미입니다.
특정 언어에 대해 언어별 제한을 설정하거나, 설정된 내용을 삭제하고 싶다면, Drag & Drop으로 한쪽 리스트에서 다른 리스트로 옮기면 됩니다.
모든 설정을 마친 뒤, 저장
버튼을 누르면 됩니다.
문제 제작하기 - FileSystem
지문
, 솔루션
, 정답 체커
, 데이터 제작
, 입력 검증
페이지에서 공통으로 사용하게 되는 기능입니다.
먼저 우측 상단에 텍스트 박스와 파일 생성
버튼이 존재합니다. 텍스트 박스에 생성할 파일 이름을 넣고, 파일 생성
버튼을 누르면 해당 폴더(지문, 솔루션 등)에 새로운 파일이 생성됩니다.
파일명 옆에 수정
버튼을 누르게 되면 파일명을 수정할 수 있습니다. 바꾸려면 저장
버튼을, 바꾸지 않으려면 취소
버튼을 누르면 됩니다.
파일명을 누르게 되면 해당 파일의 내용을 보고 수정할 수 있습니다.
파일을 수정하고 싶다면, 텍스트 박스 우측 상단에 존재하는 수정
버튼을 누르고 수정하면 됩니다. 이후 저장하려면 저장
버튼을, 저장하지 않으려면 취소
버튼을 누르면 됩니다.
X
버튼을 누르면 존재하는 파일을 삭제할 수도 있습니다.
문제 제작하기 - 지문
지문을 작성하는 페이지입니다.
지문 폴더에 존재하는 모든 파일은 배포 시 유저에게 공개됩니다. 파일 명은 유저가 볼 수 없고, 표기 이름
만 볼 수 있습니다. 따라서 유저에게 공개할 이름을 적절히 골라 표기 이름
을 정하면 됩니다.
현재 리스트에 표기된 순서대로(위에서부터) 유저에게 보입니다. 따라서 위 사진처럼 순서를 정했을 경우, 아래 사진처럼 한국어 지문이 먼저 보이게 되고, 순서대로 리스트가 결정됩니다.
순서를 변경하고 싶다면, 좌측에 존재하는 ≡
를 드래그해서 순서를 변경할 수 있습니다.
지문은 Markdown
+ MathJAX
를 이용해서 작성할 수 있습니다. Markdown
에서 HTML
태그를 사용할 수 있습니다.
지문을 작성하면 실시간으로 지문 미리 보기
를 보여줍니다. 실제 유저가 보게 되는 화면과 일치합니다.
지문을 작성할 때 예제 입출력에 관련된 내용은 작성할 필요가 없습니다. 데이터를 제작할 때 예제로 보여줄 데이터를 선택하면 자동으로 유저 지문에 보여지게 됩니다.
지문 작성에 대한 가이드는 여기에서 확인할 수 있습니다.
문제 제작하기 - 솔루션
정답 코드를 작성하는 페이지입니다.
문제를 만들 때 정답이 나와야 하는 솔루션과, 정답이 나오면 안 되는 솔루션이 존재합니다. 물론 정답이 되는 솔루션 한 개만 있어도 문제를 만들 수 있지만, 잘못된 솔루션이 통과되는 것을 막기 위해 일부러 오답 솔루션을 작성한 뒤, 결과를 확인할 수 있습니다.
정답이 되면 안 되는 솔루션을 작성하는 것을 강력하게 권장합니다.
솔루션에는 각 파일별로 언어와 타입을 결정해야 합니다. 언어는 해당 파일이 어떤 언어로 실행될 건지 고르면 됩니다.
타입은 다음과 같은 선택지가 있습니다.
MCS
AC
WA
TLE
MLE
FAIL
MCS
Main Correct Solution의 약자입니다. 해당 솔루션을 기준으로 정답 데이터를 제작하게 되며, 모든 솔루션 타입 중 정확히 한 개만 존재해야 합니다.
AC
Accept의 약자입니다. 즉 정답을 받아야 하는 솔루션입니다.
모든 테스트 케이스에 대해서 MCS 솔루션과 같은 결과를 내는 솔루션을 의미합니다.
WA
Wrong Answer의 약자입니다. 즉 오답이 나와야 하는 솔루션입니다.
모든 테스트 케이스 중 적어도 한 개 이상 MCS와 다른 결과를 내는 솔루션을 의미합니다.
TLE
Time Limit Exceeded의 약자입니다. 즉, 시간 초과가 나와야 하는 솔루션입니다.
모든 테스트 케이스 중 적어도 한 개 이상 답을 내기까지 문제에서 제한하는 시간보다 오래 걸리는 솔루션을 의미합니다.
MLE
Memory Limit Exceeded의 약자입니다. 즉, 메모리 초과가 나와야 하는 솔루션입니다.
모든 테스트 케이스 중 적어도 한 개 이상 답은 내기까지 문제에서 제한하는 메모리보다 많은 메모리를 사용하는 솔루션을 의미합니다.
FAIL
Runtime Error가 나와야 하는 솔루션입니다.
모든 테스트 케이스 중 적어도 한 개 이상 답을 내는 과정에서 런타임 에러 혹은 세그멘테이션 폴트 오류가 발생하는 솔루션을 의미합니다.
위 설명처럼 각 솔루션에 맞는 타입을 골라주면 됩니다.
하지만 솔루션의 편의를 위해 MCS
타입을 제외한 모든 타입은 복수 타겟이 가능합니다.
각 타겟 별로 적어도 하나라도 만족하면 의도한 결과라는 뜻으로 사용됩니다. (Or 조건)
예를 들어, 다음과 같은 솔루션을 작성했다고 가정해 보겠습니다.
- 어떤 결과가 나오든 적어도 통과되면 안 되는 솔루션
- 시간 초과 혹은 메모리 초과가 발생해야 하는 솔루션
1번 케이스의 경우 AC를 제외한 모든 타겟을 골라주면 됩니다.
2번 케이스의 경우 시간 초과 혹은 메모리 초과 둘 중 하나만 발생하면 되므로, 다음과 같이 타겟을 골라주면 됩니다.
위에서 제시한 방법 말고도 배포 시 실패를 막기 위해 TLE
솔루션에 대해 AC/TLE
와 같은 타겟을 의도적으로 넣기도 합니다.
의도한 타겟에 못 미치는 솔루션이 있을 경우 배포(문제화) 시킬 수 없습니다.
현재 솔루션의 언어를 고를 때 Not Running
옵션을 제대로 동작하고 있지 않습니다. 사용에 주의 부탁드립니다.
문제 제작하기 - 정답 체커
채점 코드를 작성하는 페이지입니다.
현재 리스트에 표기된 가장 위에 존재하는 체커로 채점을 진행하게 됩니다. 따라서 위 사진처럼 배치되어 있을 경우, tcmp.cc
로 채점을 진행하게 됩니다.
순서를 변경하고 싶다면, 좌측에 존재하는 ≡
를 드래그해서 순서를 변경할 수 있습니다.
정답 체커는 testlib.h
를 이용해서 작성하는 것을 강력히 추천합니다.
템플릿으로 제공하는 체커나 체커를 새로 작성하는 가이드는 여기에서 확인할 수 있습니다.
문제 제작하기 - 데이터 제작
input 데이터를 제작하는 페이지입니다.
데이터를 제작하기 위해선 데이터가 어떻게 생성되는지 과정을 먼저 알아야 합니다.
먼저 데이터를 생성하기 위한 프로세스입니다.
데이터를 생성하기 위해선 두 단계가 필요합니다.
- 데이터 제네레이터 작성
- 데이터 제네레이터를 실행하는 명령어를 작성해 실제 데이터 제작
PPS에서는 모든 데이터가 데이터 제네레이터를 통해 제작됩니다.
데이터 제네레이터란, 한 번 실행되면 테스트 케이스 하나에 대한 입력을 생성해 주는 프로그램을 말합니다.
따라서, 특정한 데이터를 생성하는 (ex. 특정 범위 내에서 랜덤으로 데이터를 만들어주는 제네레이터 등) 제네레이터를 만든 뒤, 데이터 제네레이터를 재사용하며 여러 데이터를 만드는 것입니다.
데이터 제네레이터를 재사용하며 만들기 위해 genscript라는 개념이 필요합니다.
genscript에서는 데이터 제네레이터의 이름과 제네레이터에 넘겨줄 데이터 (ex. 0 ~ n까지 랜덤으로 생성하는 데이터 제네레이터에 n값을 넘겨줌) 를 작성해야 합니다. 이렇게 작성하면 각각의 genscript가 하나의 테스트 케이스가 됩니다.
위 첫 번째 사진을 보면 generator.cc
, generator_manual.py
, generator_without_testlib.py
라는 세 제네레이터가 존재하고, 각각 별명이 random_cc
, manual
, random_py
입니다. (세 파일의 코드는 여기에서 확인할 수 있습니다.)
두 번째 사진에서는 genscript 리스트를 볼 수 있습니다.
genscript는 각각 네 가지 속성을 갖습니다.
- 스크립트: 위에서 언급했던 제네레이터의 이름과 제네레이터에 넘겨줄 데이터를 작성하는 부분입니다.
- 설명: 해당 테스트 케이스가 어떤 테스트 케이스인지 구분하기 위해 사용합니다. 디버깅의 편의를 위해 존재하는 기능이므로 작성하지 않아도 무방합니다.
- 예제로 사용 여부: 예제로 사용할지 아니면 채점 데이터로만 사용할지 여부입니다. 선택한다면 응시자들의 지문에 노출되게 됩니다.
- 인보케이션에 포함시키지 않음: 디버깅을 할 때 이미 검증된 데이터를 계속 검증할 필요는 없습니다. 따라서, 디버깅 시간을 줄이기 위해 테스트(인보케이션)할 때 해당 데이터를 포함시키지 않습니다.
인보케이션에 포함시키지 않음 기능은 현재 작동하지 않습니다. 사용에 유의 부탁드립니다.
각각 데이터를 만들기 위해 스크립트 부분에 generator_별명 argument_1 arguments2 ...
형태로 스크립트를 작성하면 해당 별명을 가진 제네레이터에 원소를 순차적으로 넘겨주게 됩니다. 이때 Command Line Arguments 기능을 사용해서 넘겨주게 됩니다. 자세한 정보는 데이터 제네레이터 작성 가이드를 참조해 주세요.
이렇게 만든 데이터는 genscript를 작성한 순서대로 (위에서부터 아래로) 데이터가 생성되고, 채점도 순서대로 진행하게 됩니다.
예제로 사용한 데이터도 채점 데이터에 포함되며, 예제 데이터를 리스트에서 3번째 7번째처럼 띄워서 고른다고 하더라도 상대적인 순서를 유지하며 유저에게 보이게 됩니다.
순서를 변경하고 싶다면, 좌측에 존재하는 ≡
를 드래그해서 순서를 변경할 수 있습니다.
더 많은 데이터 제네레이터 작성 가이드는 여기에서 확인할 수 있습니다.
문제 제작하기 - 입력 검증
데이터 제작에서 만든 데이터를 검증하는 코드를 작성하는 페이지입니다.
입력 데이터가 문제 조건에 위배되지 않는지 검증해 주는 코드입니다. 밸리데이터는 만들지 않아도 문제 되지는 않지만, 만드는 것을 강력하게 추천합니다.
현재 리스트에 표기된 가장 위에 존재하는 밸리데이터로 입력 데이터를 검증하게 됩니다. 따라서 위 사진처럼 배치되어 있을 경우, validator.cc
로 검증을 진행하게 됩니다.
순서를 변경하고 싶다면, 좌측에 존재하는 ≡
를 드래그해서 순서를 변경할 수 있습니다.
밸리데이터는 testlib.h
를 이용해서 작성하는 것을 강력히 추천합니다.
밸리데이터 작성 가이드는 여기에서 확인할 수 있습니다.
문제 제작하기 - 인보케이트
기존에 인보케이션(테스트) 했던 결과를 확인할 수 있는 페이지입니다.
상단 박스에 인보케이트 버튼을 누르면 테스트 요청을 할 수 있습니다.
위 사진은 테스트 요청 직후입니다. 아직 테스트가 되지 않아 대기 중
메시지가 있습니다.
위 사진은 실행 중
으로 표기되어 있습니다. 현재 테스트가 진행 중이라는 뜻입니다.
테스트가 종료되어 성공
으로 표기되어 있습니다.
등록한 모든 솔루션이 의도한 결과대로 나왔음을 의미합니다.
결과에 나와있는 성공
과 같은 메시지를 누르면 각 솔루션 별 테스트 케이스 결과를 알 수 있습니다.
각 솔루션이 해당 테스트 케이스에 대해 어떤 결과가 나왔고 총 걸린 시간을 보여줍니다.
현재 디자인 이슈로 임시로 그려놓은 페이지입니다. UI/UX를 고려해 디자인을 반영한 뒤 문서를 보완할 계획입니다.
현재 결과는 성공으로 나와있고 모든 솔루션이 제대로 실행됐지만, 그렇지 못한 경우가 있을 수 있습니다.
예를 들어, 데이터 제작 중 데이터 제네레이터가 오류가 나거나, 입력 검증에 실패한다거나 체커가 잘못되어 또 다른 오류가 발생할 수 있습니다. 이때는 테스트 프로세스가 중단될 수 있습니다.
인보케이션 결과 혹은 채점 결과로 나올 수 있는 모든 결과는 여기에서 확인할 수 있습니다.
문제 제작하기 - 배포
배포(문제화)했던 결과를 확인할 수 있는 페이지입니다.
인보케이션과 동일하지만, 실행이 끝난 후 각 솔루션 별 테스트 케이스 결과는 보이지 않습니다. 무언가 문제가 생겼다면 인보케이트 기능을 사용해서 문제를 해결해야 합니다.
배포 결과로 나올 수 있는 모든 결과는 여기에서 확인할 수 있습니다.
문제 제작하기 - 권한 관리
문제에 접근 권한을 줄 수 있는 페이지입니다.
처음엔 아무에게도 권한을 추가하지 않았기 때문에 문제 제작자만 ADMIN
으로 등록되어 있습니다.
만약 다른 계정에 문제에 대한 접근 권한을 추가하려면 다음과 같이 입력해 주면 됩니다.
각 권한 별 할 수 있는 일과 권한 관리에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
문제 제작 With Github
Github를 이용해 문제를 제작하는 방법입니다. 문제 생성, 인보케이션, 배포를 하기 위해서는 PPS에 접속해야 하지만, 그 외에는 Github를 통해 PPS에 접속하지 않고도 문제를 제작할 수 있습니다.
이번 챕터에서는 위 방법을 소개합니다.
단, 기존에 JSON과 PPS를 이용해서 문제를 만들어본 경험과 Github를 사용할 수 있다는 가정 하에 작성된 문서입니다.
문제 제작 With Github - 문제 레포지토리 생성하기
레포지토리 생성 과정은 동일합니다. PPS 사이트에 접속해서 생성해 주면 됩니다.
문제 제작 With Github - 레포지토리 Clone
레포지토리를 Clone 해야 합니다. Github 열기
버튼을 눌러 Github에 접속한 뒤 프로젝트를 내려받아야 합니다.
만약 프로젝트를 수정하는 중간에 중간에 PPS를 통하거나 다른 사람이 프로젝트에 기여했다면 레포지토리를 Pull 받아야 합니다.
문제 제작 With Github - Repository Architecture
템플릿 레포지토리를 참고하면 좋습니다.
폴더 루트에 config.json
이 존재하고, checker
, generator
, solution
, statement
, validator
폴더가 존재해야 합니다.
각 폴더에는 문제를 만들기 위한 소스 코드 파일만 존재하면 됩니다. 그 외 모든 설정 (시간 제한, genscript, checker 설정 등)은 config.json
에서 다룹니다.
문제 제작 With Github - config.json
config.json
은 다음 형태로 작성하면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
{
"problem_title": "문제 제목", // 문제 제목
"problem_type": "stdio", // 문제 타입
"checker": "tcmp.cc", // 체커 파일 이름
"checker_language": "cpp11", // 체커 파일 언어 코드
"validator": "validator.cc", // 밸리데이터 파일 이름
"validator_language": "cpp11", // 밸리데이터 파일 언어 코드
"limits": {
"time": 1000, // 문제 시간 제한
"memory": 134217728, // 문제 메모리 제한
"factor": { // 언어별 제한
"py3": { // Python3에 대해 제한 설정
"time": 0,
"memory": 268435456
}
}
},
"enable_language": [], // 현재는 사용하지 못함
"statements": [ // 등록된 지문
{
"name": "statement.md", // 지문 파일 이름
"label": "한국어" // 응시자에게 보일 지문 이름
},
// ...
],
"solutions": [ // 등록된 솔루션
{
"name": "solution.cc", // 솔루션 파일 이름
"language": "cpp11", // 솔루션 파일 언어 코드
"type": "MCS" // 솔루션 파일 타겟
},
{
"name": "solution_reject.cc", // 솔루션 파일 이름
"language": "cpp11", // 솔루션 파일 이름
"type": "WA/TLE/MLE/FAIL" // 복수 솔루션 파일 타겟
},
// ...
],
"generators": [ // 등록된 제네레이터
{
"name": "generator.cc", // 제네레이터 파일 이름
"language": "cpp11", // 제네레이터 파일 언어 코드
"alias": "random_cc" // 제네레이터 별명
},
// ...
],
"genscript": [ // 등록된 genscript
{
"script": "random_cc 1 3 3 6", // 스크립트
"description": "예제 데이터 1번입니다.", // 설명
"is_example": true, // 예제로 사용
"only_deploy": false // 인보케이션에 포함 (true 일 경우 인보케이션에 포함하지 않음)
},
{
"script": "random_cc 1 9 1 9", // 스크립트
"description": "", // 설명
"is_example": false, // 예제로 사용하지 않음
"only_deploy": false // 인보케이션에 포함 (true 일 경우 인보케이션에 포함하지 않음)
},
// ...
],
"versions": { // 필수로 작성해야 합니다.
"config": 1,
"repository": 1
}
}
형식만 다를 뿐 PPS 사이트에서 입력하던 정보와 동일하기 때문에 템플릿 레포지토리로 생성했다면, 어렵지 않게 작성할 수 있습니다.
사용되는 언어 코드
는 여기에서 확인할 수 있습니다.
문제 제작 With Github - 인보케이트 및 배포
로컬에서 모든 작업을 마쳤다면, 인보케이트 혹은 배포를 진행해야 합니다.
따라서, 진행한 작업을 Commit, Push 한 뒤 PPS사이트로 접속하면 작업물이 반영된 것을 확인할 수 있습니다.
이후 기존 프로세스와 같이 인보케이트 혹은 배포를 진행하면 됩니다.