baekjoon   2년 전

안녕하세요.

기존에는 기능 추가와 같은 것만 업데이트에 글을 썼지만, 2022년 부터는 별도로 작성하지 않았던 내용들도 기록을 남겨보려고 합니다.

1. Good Bye, BOJ 2021!

2021년 한 해를 마무리하는 대회가 성공적으로 끝났습니다. 항상 좋은 대회를 만들어 주셔서 감사하고, 좋은 대회에 참여해주셔서 감사합니다.

한 가지 안타까운 점으로는 스코어보드 오픈(어워드 모드)가 있었습니다. BOJ는 HTML 표, 스팟보드, BOJ 보드를 지원하고 있는데, 여기서 스팟보드와 BOJ 보드만 어워드 모드가 가능합니다.

그냥 전체 스코어보드를 보여주는 것은 어떤 방식을 사용하나 문제가 없습니다. 하지만, 어워드 모드는 전체 제출 정보를 받아오고, 이를 웹 브라우저에서 연산을 통해서 스코어보드를 업데이트 해야 하기 때문에, 참가자가 많아지면 문제가 생깁니다.

이 부분 때문에 해설 방송에서 스코어보드 오픈이 조금 늦어진 것 같습니다.

스팟보드에는 스코어보드 오픈을 N등 부터 시작하는 기능이 있습니다. 이 기능은 실제로 사람이 키를 하나씩 누르면서 오픈하는 것을 시뮬레이션 합니다. BOJ 보드에는 이런 기능이 없습니다. 참가자가 많은 경우 이 시뮬레이션 과정에서 중간에 멈추는 경우가 매우 자주 있습니다.

곧 열릴 Hello, BOJ 2022!도 많은 참가자가 예상되어 어떻게 하면 좋을지 생각해보았습니다.

스팟보드는 N등까지 미리 여는 기능이 있고, BOJ 보드는 이 기능이 없습니다. 두 보드의 코드를 큰 수정 없이 이를 매끄럽게 지원하는 아이디어가 생각났습니다. 서버에서 미리 등수를 정렬하는 시간은 매우 짧게 걸립니다. 어워드 모드에 옵션을 추가해 N등까지만 두 보드에 정보를 보내면 웹 브라우저의 DOM 오브젝트와 연산의 수가 크게 줄어들어서 큰 문제없이 잘 진행될 것으로 예상됩니다.

이 기능을 간단히 테스트 해보았는데 잘 동작하였고, 다음 Hello, BOJ 2022! 에서 선보일 예정입니다.

2. 대회 > 참가 신청

대회에 미리 참가 신청하는 기능이 생겼습니다. 이 기능 역시 Good Bye, BOJ 2021!을 위해 만들었습니다.

가장 처음에는 참가 신청 페이지에서 이름, 이메일 주소, 성별, 직업, 등 대회 주최자가 원하는 항목을 직접 입력하는 형태였습니다. 이를 위해 12월 말에 대회 주최자가 원하는 항목을 선택, 추가, 참가 신청 페이지에서 이 정보를 입력, 수정하는 기능을 만들었습니다.

BOJ는 최소한의 개인 정보를 저장하기 위해서 노력하고 있고, 현재도 이메일 주소 이외에 큰 개인 정보는 요구하고 있지 않습니다. 현재의 아이디 제도도 BOJ의 2020년 마무리 글에서 언급한 것 처럼 폐지 후 변경이 가능한 닉네임 제도로 변경하기 위해서 2021년부터 계속 준비 중입니다. 이런 생각이 있었고, 만든 소스 코드와 기능을 모두 지우고, 현재의 형태처럼 단순히 이메일 주소를 제공할 것인지 선택하는 형식으로 변경되었습니다.

대회 참가 신청을 한 경우 대회 시작 전에 미리 알림 메일을 보내주는 것도 생각하고 있습니다.

3. 대회 기타 기능 개선 테스트

대회 운영진은 웹훅 주소를 설정해 슬랙이나 디스코드로 이벤트를 받을 수 있습니다. 현재는 질문이 등록된 경우만 전송하고 있는데, 다양한 웹훅을 조금 테스트해보았습니다. 이 기능은 Hello, BOJ 2022! 전에 연습 대회로 테스트 해볼 예정입니다.

지난 2018년부터 요청을 많이 받았던 대회 Q&A 프리셋 기능도 추가했습니다. 이 기능도 위에서 언급한 연습 대회로 테스트해보고 배포 할 에정입니다.

4. North-Western Russia Regional Contest 문제 공개 및 완성

North-Western Russia Regional Contest 대회는 BOJ의 초창기부터 있던 출처이지만, 일부 문제는 [삭제] 상태였습니다.

NEERC Northern Subregional 2005에서는 A번만 공개되어 있는 상태였는데, 12/31, 그리고 1/1에 나머지 B-K를 모두 공개했습니다.

이 대회의 패키지는 데이터가 들어있지 않고, 생성 코드가 들어있습니다. 생성 코드는 Pascal로 작성되어 있습니다. 

A만 공개하고 B부터 공개를 하지 못한 이유는 B의 데이터 생성 코드가 게속해서 컴파일 에러가 났기 때문입니다. 그래서, 당시에 B에서 중단했었습니다.

이번에는 C부터 공개를 시작했고, K까지 모두 공개할 수 있었습니다. 패키지 파일에는 스페셜 저지 코드도 함께 들어있는데 이것도 Pascal로 구현되어 있습니다.

H의 스페셜 저지 코드가 컴파일은 되지만, 계속해서 올바르게 채점을 하질 않아서 전에 B에서 포기했던 것 처럼 중단할까 고민을 했었습니다. 다행히 1시간 만에 Pascal의 assert는 Java 처럼 컴파일 타임에서 제외된다는 사실을 알았습니다. 따라서, {$C+} 플래그를 소스 코드에 추가해서 올바르게 채점을 할 수 있게 되었습니다.

A를 올린 이후 수많은 데이터 생성, 스페셜 저지 Pascal 코드를 보고 수정했기 때문에, 이번에는 B도 데이터 생성 코드를 수정할 수 있을 것이라 생각해 수정해보았습니다. B는 데이터 생성 코드의 링크드 리스트 구현이 문제였는데, 다행히 그동안 Pascal 소스를 많이 봐서 그런지 수정에 성공했고, 이 문제도 채점에 지원할 수 있게 되었습니다.

다른 출처를 보니 NEERC Northern Subregional 2012는 K번만 [삭제] 상태였습니다. 문제에 제가 남긴 메모를 보니 "spj가 이상하다" 라고 되어 있었고, 스페셜 저지 코드를 보았습니다.

이 문제의 스페셜 저지 코드는 Java로 되어 있는데, 다른 jar 파일과 함께 컴파일해서 채점을 해야 하는 경우였습니다. 한 30분간 이것 저것 해본 결과 jar 파일로 되어 있는 외부 라이브러리의 소스 코드를 찾아, 이를 함께 컴파일 하면 될 것 같았습니다. 소스를 찾아서 컴파일 해보았으나, 계속해서 채점은 실패했습니다.

다시 30분간 이것 저것 해본 결과 라이브러리의 소스 코드에 컴파일 에러가 나는 코드가 한 줄 있었고, 이를 수정해 채점을 지원할 수 있게 되었습니다.

이제 NEERC Northern Subregional 2002만 남았고, 이 출처는 I만 공개 되어 있었고, 나머지 문제는 스페셜 저지만 작성하고, 문제 본문만 올리면 되는 상태였습니다.

문제 본문을 올리면서 스페셜 저지를 하나씩 작성해서 모두 공개했습니다.

저는 또 다시 돌아오겠습니다.

댓글을 작성하려면 로그인해야 합니다.