UCPC 2018 대회 개최 후기

Asset 1

UCPC 2018

UCPC 2018은 전국 대학생 프로그래밍 대회 동아리 연합(이하 전대프연)에서 진행하는 여름 대회입니다.

2018년 이전에는 BOJ에서는 UCPC 2015가 열린 적이 있습니다. 그 이후, 여러 사정으로 인해 다른 플랫폼을 사용하다가 올해는 BOJ에서 개최하게 되었습니다.

기존의 UCPC는 전대프연 소속 동아리에서 신청을 받아서 참가했기 때문에, 참가자의 규모가 크지 않았습니다. 이번 UCPC 2018은 참가 제한을 대학/대학원생으로 확대했습니다. 따라서, 기존과는 다른 참가자의 규모가 예상되는 대회입니다.

이모지

UCPC 2018은 팀 이름으로 진행되는 대회입니다. 팀 이름을 보여주는 기능은 이미 BOJ에 구현되어 있습니다. 팀에 소속된 팀원의 이름도 볼 수 있습니다.

보통 팀 이름은 한글, 영어, 숫자정도로만 이루어지기 때문에, 큰 문제가 되지 않습니다. 특수 문자가 있다고 해도 그렇게 큰문제는 아닙니다. 하지만, UCPC 2018에는 보통의 대회에서는 볼 수 없는 팀 이름과 팀원의 이름이 존재합니다.

  • 🤔
  • 🤔⭕❓❌😞😡😡😡
  • 🐟 (🐢, 🐳, 🐧)

바로 이모지입니다.

지금까지 BOJ에서는 이모지를 지원하지 않았습니다. 물론, 예외는 있었습니다. 바로 지난 2018년 4월 1일에 열렸던 제 1회 구데기컵입니다.

구데기컵에서는 다행히도 문제 번호만 이모지였습니다.

Screenshot 2018-08-07 04.36.51

BOJ는 MySQL을 사용하고 있고, 기존에 사용하던 문자 집합(Character set)은 utf8입니다. 당연히 이모지도 UTF-8로 표현할 수 있기 때문에, 매우 당연히 될 것 같았는데, 놀랍게도 그렇지 않았습니다.

MySQL의 utf8이 UTF-8이 아니었습니다. 바로 utf8mb4가 UTF-8이었습니다. 자세한 내용은 다른 글을 통해서 알아봅시다.

따라서, 일부 테이블의 문자 집합을 utf8mb4로 변환하는 과정이 필요했습니다. 구데기컵은 문제 번호만 이모지였기 때문에, 관련 테이블은 2개밖에 없었습니다. 테이블 2개의 문자 집합은 다운 타임 없이 바로 변경할 수 있었습니다.

다시 UCPC 2018로 돌아옵시다.

UCPC 2018은 팀 이름에 이모지가 들어갑니다. 당연히 팀 이름과 관련된 테이블만 utf8mb4로 변환하면 될 것 같았지만, 여기서 아주 중요한 결정을 하게 됩니다.

모든 테이블의 문자 집합을 utf8mb4로 바꾸자!

결국 약 2시간 동안 BOJ 모든 테이블의 문자 집합을 utf8mb4로 바꾸게 되었습니다. 테이블의 문자 집합을 다운 타임 없이 변경해야 했었습니다. 따라서, 레코드의 개수가 적은 테이블은 그냥 바꿨고, 많은 테이블은 테이블을 새로 만들고 바꿔치기 하는 방식으로 바꿨습니다. 물론, 중간에 실수를 해버려서 1시간 동안 BOJ가 내려갔었습니다 ㅠㅠ

의도치 않게 이모지 변수를 지원하는 Swift를 이용해 이모지 코딩을 할 수 있게 되었습니다.

37100779_1123009597848103_6556046914809233408_n

UCPC 2018 예비소집

UCPC 2018 예비소집과 예선은 BOJ의 예전 시스템으로 진행되는 마지막 대회입니다. 예전 시스템은 모든 진행을 관리자와 함께 해야 하는 시스템입니다. 문제의 수정, 데이터의 수정과 같은 모든 기능은 대회 운영진이 직접 할 수 없고, 모두 관리자를 통해야 하는 시스템입니다.

다행히도 BOJ의 운영자와 UCPC 2018의 디렉터가 친분이 있었습니다. 따라서, 디렉터를 스타트링크의 사무실로 불러서 직접 관리자의 역할을 수행하게 했습니다. 데이터의 업로드는 직접 할 수 없었지만, 옆 자리에 앉아서 일을 진행했기 때문에, 신속한 일처리를 할 수 있었습니다.

예비 소집은 2018년 7월 14일 0시부터 7월 15일 13시까지 진행되었습니다. 예비 소집에서 사용한 문제는 총 4개이고 아래와 같습니다.

B번 문제는 실제로 사무실을 둘러보던 디렉터가 순간의 재치로 만들어 낸 문제입니다. 논란의 여지가 있으면 안되기 때문에, “스타트링크의 사무실에 있는 컴퓨터는 몇 개 인가?” 와 같은 문제는 출제할 수가 없었습니다. 예시로 든 문제는 “컴퓨터의 정의는 무엇인가?” 부터 논란이 될 수 있는 주제이기 때문입니다.

예비 소집이 시작되었을 때, C번과 D번은 문제가 빈 칸이었습니다. 아직 문제가 준비되지 않았기 때문입니다. 전날 대회 준비로 디렉터님이 너무 피곤했기 때문에, 집에가서 자고 일어난 다음 만들기로 했습니다.

기록을 보면 D번은 7월 14일 오후 10시 37분, C번은 7월 15일 오전 4시 45분에 BOJ에 추가되었습니다.

참고로 D번은 디렉터님의 학부 졸업 논문 주제와 매우 밀접한 관계를 가지고 있다고 합니다.

UCPC 2018 예선

UCPC 2018 예선의 참가 팀의 수는 총 208팀입니다. 팀당 팀원의 수는 총 3명이기 때문에, 최대 624명이 예상됩니다.

이 정도 실시간 접속자는 BOJ에게 큰 부담이 되질 않습니다.

사이트 특성상 이용자는 BOJ에 오랜 시간 접속해 있지만, 페이지 뷰는 다른 사이트에 비해 크게 많지 않습니다.

게시판 기반의 사이트는 이용자의 주 콘텐츠가 게시판 글, 댓글 읽기/쓰기이기 때문에, 페이지의 이동이 매우 빈번하게 일어납니다.

온라인 저지는 문제를 열고 자신의 컴퓨터에서 코딩하는 시간을 가지게 됩니다. 따라서, 대회가 아닌 경우에는 실시간 접속자 수에 비해 페이지뷰는 매우 적게 나옵니다. 물론 BOJ에는 게시판이 있지만, 주된 콘텐츠는 아닌 것 같습니다. 이 내용은 이용자에 따라서 다르게 느낄 수는 있습니다.

이용자의 접속이 증가한다고 해도, 알아서 Auto Scaling이 진행되기 때문에, 별로 큰 문제는 아닙니다.

이건 큰 착각이었습니다.

바로 대회가 시작될 때입니다. 즉, 대회가 시작하는 14시를 기준으로 대부분의 이용자는 새로고침을 누르게 됩니다.

Auto Scaling은 이용자가 점점 늘어나는 경우에는 잘 동작합니다. 하지만, 갑자기 트래픽이 폭발적으로 증가할 때는, 서버를 켜는 시간 때문에 조금 대응에 늦게 됩니다.

바로 이 점을 생각하지 못했었습니다.

14시를 전후로 매우 많은 사용자가 새로고침을 눌렀기 때문에, BOJ 평균 응답 시간 (75ms)의 약 25배 (2000ms)에 해당하는 응답 시간을 기록했습니다. 서버를 한 대 켜는것은 약 5분 정도 걸리기 때문에, 이 현상을 목격한 이후 재빠르게 서버를 더 켜서 대회 기간 내내 쾌적한 BOJ를 유지했습니다.

이후 큰 문제 없이 대회가 끝났습니다.

대회가 종료된 후에는 풀이 방송과 스코어보드 오픈 방송이 예정되어 있었습니다.

스타트링크에 있는 놀라운 성능의 컴퓨터놀라운 성능의 마이크를 이용해 매우 쾌적한 방송 환경을 만들었습니다.

스코어보드를 오픈하던 중 스팟보드에 대한 이해 부족으로 인해 잘못된 수상 슬라이드가 잠시 화면에 나온 실수가 있었습니다.

다행히도 이 문제는 이후 스팟보드에 대한 높은 이해와 BOJ Stack의 개발로 인해 다시 벌어지지 않게 되었습니다.

UCPC 2018 본선 준비

UCPC 2018 본선은 예선 2주 후에 열렸습니다.

오프라인 대회 입니다!

오프라인 대회는 온라인 대회와는 중요한 점이 조금 다릅니다.

온라인 대회는 대회 특성상 매우 많은 사용자를 감당하는 것이 중요합니다. 오프라인 대회는 매우 적은 수의 사람이 참가합니다. 따라서, 이용자의 수는 중요한 점이 아닙니다.

BOJ는 온라인 저지 입니다. 아무리 대회 기능과 기타 여러가지 기능이 있다고 해도, 기본은 온라인 저지입니다.

대회를 온라인 저지에서 개최하는 것은 호불호가 갈립니다. 호불호가 갈리는 대표적인 이유는 바로 온라인 저지라는 점 입니다. 로그인해서 여러가지 기능이 있는 사이트에서 대회 탭을 사용하는 것이 대회 전용 플랫폼이라는 느낌을 주지 않아 좋아하지 않는 사람들이 있습니다.

따라서, BOJ는 꽤 오래전부터 이런 사람들을 위해 대회 전용 아이디를 발급해왔습니다.

대회 전용 아이디는 오직 대회만 참여할 수 있는 아이디입니다.

BOJ + 대회 전용 아이디는 지금까지 여러가지 문제가 있었습니다.

첫 번째는 계속해서 강조하지만 BOJ는 온라인 저지라는 점 입니다. 로그인 없이도 사이트를 둘러볼 수 있습니다. 따라서, 로그인을 하지 않은 상태에서는 온라인 저지인데, 로그인을 하면 갑자기 대회 탭만 있는 대회 플랫폼으로 변하는 점이 어색하다고 느낄 수 있습니다.

두 번째는 위의 문제 때문에, 다른 대회를 참여할 수 있다는 점입니다. 보통 오프라인 대회는 공개 대회(Open Contest, 누구나 참가할 수 있는 공개 대회)를 같이 개최하게 됩니다.

공개 대회를 둘러보다가 로그인을 한다면, 실수로 공개 대회를 참가하게 될 수도 있습니다. 이 문제는 UCPC 2018 예비 소집과 그 이전에도 실제로 발생한 일입니다. 따라서, UCPC 2018 예비소집 중에 긴급한 패치를 통해서 불가능하게 만들긴 했습니다.

더 많은 이유도 있겠지만, 이제 큰 문제가 되지 않습니다.

독립된 사이트에서 대회를 참가할 수 있는 기능이 생겼습니다.

https://ucpc.acmicpc.net

독립된 사이트에서 대회 전용 아이디를 통해 대회를 치뤄 대회 전용 플랫폼의 느낌을 가질 수 있습니다.

UCPC 2018 본선 스코어보드

UCPC 2018은 스팟보드를 사용합니다.

BOJ는 스팟보드를 2015년부터 지원했습니다. 스팟보드를 사용한 첫 대회가 UCPC 2015이니 의미 있는 스코어보드입니다.

하지만, 스팟보드에 대한 이해의 부족과 당시 코딩 실력의 한계로 인해 스팟보드는 http://www.acmicpc.net이 아닌 ucpc2015.acmicpc.net와 같은 도메인에서만 진행할 수 있었습니다.

따라서, 스팟보드를 사용하려면 새로 도메인을 결정해야 하는 귀찮음이 있었고, 같은 도메인이 아니라서 발생하는 여러가지 문제 때문에, 스팟보드는 점점 지원하지 않는 방향으로 가고 있었습니다.

이번 UCPC 2018부터는 BOJ에 스팟보드를 내장해서 지원하기로 결정했습니다. 코드를 최소로 수정해서 BOJ의 http://www.acmicpc.net 도메인에서 스팟보드를 지원할 수 있게 되었습니다. 앞으로도 BOJ와 붙어서 잘 동작할 수 있게 스팟보드를 업데이트 하려고 합니다. (리포지토리)

도메인의 문제를 모두 해결했다고 쳐도, 문제는 스코어보드 오픈입니다. 프리징(업데이트가 중단)된 상태에서 아래 순위부터 차례대로 스코어보드를 공개하는 것을 “스코어보드 오픈”이라고 합니다. 이 스코어보드 오픈이 진행될 때는 수상 슬라이드를 보여주기도 합니다. 참고로 스코어보드 오픈은 어워드 모드라고 부르기도 합니다.

BOJ는 UCPC 2018전까지는 스팟보드를 일부만 지원했기 때문에, 수상 슬라이드를 보여주려면 로컬에서 json파일을 다운받아서 진행했어야 합니다. 수상자를 BOJ Stack을 이용해 입력하면, 자동으로 슬라이드를 만들어주는 기능을 통해서 별도의 작업없이 스코어보드 오픈을 진행할 수 있게 되었습니다.

또한, 스코어보드를 오픈하려면 프리징된 시점을 계산하는 과정이 필요했습니다. 이 과정은 놀랍게도 이전까지는 수작업으로 진행되었습니다. 프리징된 상태의 json파일과 프리징되지 않은 json 파일을 다운받아 결과가 달라지는 지점을 계산해서 스코어보드 오픈의 시작점으로 넘겨줬어야 합니다.

이 작업은 코드를 이용해서 쉽게 할 수 있을 것 같지만, 도메인이 달라 프리징 되지 않은 json을 만드는 것이 조금 어려웠습니다. 물론, 지금은 코딩 실력도 늘었기 때문에, 간단한 주소를 이용해서 스코어보드 오픈을 지원할 수 있게 되었습니다.

기타 여러가지 UCPC 2018을 준비하면서, 비공식 참가자 (스코어보드에는 보이지 않는 참가자), 스코어보드 외부 공개 (비공개 대회에 참가하지 않는 사람들에게만 스코어보드 공개) 등을 옵션으로 지원할 수 있게 되었습니다.

지금은 조금 더 높은 스팟보드에 대한 덕분에, 스팟보드의 거의 모든 기능을 지원하고 있습니다.

UCPC 2018 본선 문제

UCPC 2018 온라인 예선의 문제는 관리자 계정으로 직접 업로드 해야 했고, 데이터는 관리자가 직접 업로드 했어야 했습니다.

UCPC 2018은 BOJ Stack을 이용해 대회를 준비한 첫 대회가 되었습니다. BOJ Stack은 문제 본문 등록, 데이터 업로드와 테스트 등을 자동으로 수행하는 플랫폼으로, BOJ에 붙어서 서비스되고 있습니다. 문제 뿐만 아니고, 대회와 관련된 여러가지 기능도 수행할 수 있습니다.

이 곳은 UCPC 2018의 성공적인 개최를 자축 및 축하는 자리이고, 아직 정식 오픈하지도 않은 서비스이기 때문에, BOJ Stack에 대한 자세한 소개는 나중에 다른 포스팅으로 다시 하겠습니다.

UCPC 2018 본선

오프라인 대회와 온라인 대회는 중요한 점이 조금 다릅니다.

온라인 대회에서 가장 중요한 점은 참가자의 규모입니다. 아무래도 예선은 본선보다 참가자 수가 몇 배는 많기 때문입니다. 본선은 참가자가 많지 않기 때문에, 조금 다른 점이 중요합니다.

바로 풍선 달기, 인쇄와 같은 점입니다.

보통의 오프라인 대회는 참가자에게 풍선을 달아줍니다. 풍선은 문제를 풀었다는 의미입니다.

2018-07-29 13.51.22.jpg

문제마다 풍선의 색이 정해져 있고, 어떤 문제를 해결하면, 그 문제에 해당하는 풍선을 대회 스태프가 가서 직접 달아줍니다.

문제를 첫 번째로 풀거나 어려운 문제를 해결하는 경우에는 문제의 출제자나 특별한 사람이 직접 풍선을 달아주러 가기도 합니다.

매번 스코어보드를 보거나 채점 현황을 보고 누가 문제를 풀었는지 알아내는 것은 매우 어렵고 귀찮은 일이기 때문에, BOJ에는 풍선 현황이 존재합니다. 이 페이지를 보고 풍선을 누구에게 줘야할지 알아낼 수 있습니다.

ABJ05415.jpg

위의 사진에는 자리 번호가 입력되어져 있지 않지만, 사진이 찍힌 이후에 자리 번호를 입력해 조금 더 편안하게 풍선을 나눠줄 수 있었습니다.

또한, 대회에는 인쇄가 필요할 수도 있습니다. 3인 1팀으로 참가하는 대회는 한 명이 컴퓨터를 사용하는 동안 다른사람이 컴퓨터를 사용할 수가 없습니다. 따라서, 다른 두 명은 다른 문제를 풀거나 자신이 틀린 문제를 디버깅해야 합니다. 코드를 머리 속으로 생각하거나, 종이에 옮겨적는 것은 매우 불편하기 때문에, 보통의 대회는 인쇄를 지원합니다.

대회 주최에서 컴퓨터를 모두 제공하는 대회는 네트워크 프린터를 설정해서 인쇄 기능을 지원할 필요가 없습니다. 하지만, UCPC 2018처럼 팀 별로 노트북을 들고 와야 하는 대회는, 네트워크 프린터를 설정하는 것이 더 어렵습니다. 따라서, BOJ에 있는 인쇄를 요청하는 기능을 이용할 수 있습니다.

dsc08282.jpg

BOJ는 예선 팀명 덕분에, 모든 곳에서 이모지를 지원합니다. 하지만, 인쇄를 하던 컴퓨터는 그렇지 않았던 것 같습니다. 이모지가 인쇄되지 않아 슬펐습니다.

대회 경품 추첨과 같은 기능은 BOJ에서도 지원하는 것도 좋을 것 같습니다.

UCPC 2018 그 이후

BOJ의 대회 플랫폼 데뷔가 매우 성공적으로 끝났습니다.

이 시기에 발견된 여러가지 불편함은 모두 BOJ에 다시 수정사항으로 반영되었습니다.

6일후 열린 카카오 코드 페스티벌 2018 예선 후기도 있습니다.

UCPC 2018 대회 개최 후기”에 대한 답글 1개

댓글 남기기

About Baekjoon

스타트링크 블로그에서 지루한 글을 담당하고 있습니다!