
BOJ Performance
백준 채점 현황에서 내 코드의 성능 위치를 그래프로 보여주는 브라우저 확장
운영 중단누적 225명
AS-IS → TO-BE
AS-IS
- problem_id 만 보고 전체 AC 결과를 수집
- 진행 중인 대회에서도 남의 제출 통계가 노출
- 타 확장이 켜져 있어야만 데이터 요청이 통과
TO-BE
- contest_id 를 감지하면 확장이 동작하지 않음
- 대회 중에는 통계를 보여주지 않음
- 요청 헤더를 직접 맞춰 단독으로 동작
BOJ 채점 서비스가 중단되어 운영을 함께 중단했습니다. 서비스가 돌아오면 호환성을 확인한 뒤 운영 재개 여부를 판단합니다.
서비스
백준에서 문제를 풀면 실행 시간과 메모리가 숫자로만 나옵니다. 그 숫자가 좋은 건지 나쁜 건지는 알 수 없습니다.
LeetCode가 제출 결과를 분포 그래프로 보여주는 것을 보고 같은 것을 백준에 붙였습니다. 채점 현황 페이지에서 전체 제출자 분포 안의 내 위치를 막대 그래프로 보여줍니다.

Chrome·웨일·Firefox 세 스토어에 배포했고 누적 225명이 설치했습니다 — Chrome 134명, 웨일 90명, Firefox 1명.
만들면서 정한 것
비교 대상을 같은 언어로 한정
C++ 제출과 Python 제출을 한 분포에 넣으면 실행 시간 비교가 의미를 잃습니다. 백준 페이지 상단의 언어 필터를 감지해, 필터를 바꾸면 그래프도 해당 언어 통계로 자동 갱신되게 했습니다. Python 3를 고르면 Python 3 제출자 안에서의 위치를 봅니다.
표본 범위를 화면에 적었다
상위 15.20%만 쓰면 무엇을 기준으로 한 건지 알 수 없습니다. (최근 200건 기준)을 항상 같이 표시해, 숫자를 과장하지 않고 그대로 읽히게 했습니다.
남의 확장과 충돌하지 않게
백준 사용자는 boj-extended 같은 확장을 이미 쓰는 경우가 많습니다. OS 다크 모드뿐 아니라 그 확장의 다크 모드 설정까지 감지해 테마를 맞췄습니다.

트러블슈팅 1: 기능이 대회의 공정성을 깨뜨렸다
배포하고 나서 사용자 제보를 받았습니다. 진행 중인 대회에서도 다른 사람들의 제출 통계가 보인다는 것이었습니다.
원인은 단순했습니다. URL에 problem_id가 있으면 그 문제의 전체 AC 결과를 수집해 보여주는 구조였고, 대회 문제도 결국 문제 하나라 그대로 걸렸습니다. 평소에는 유용한 기능이 대회에서는 다른 참가자의 풀이 여부와 성능을 실시간으로 흘리는 통로가 됐습니다.
대회 페이지의 URL을 뜯어보니 대회 중에는 contest_id 파라미터가 붙었습니다. contest_id가 있으면 확장이 아예 동작하지 않도록 예외 처리하고 배포했습니다.
대회 중에 일부만 보여주는 방법을 고민하는 대신 기능을 끄는 쪽을 택했습니다. 이 기능이 없다고 손해 보는 사람은 없지만, 새는 순간 대회가 망가지기 때문입니다.
트러블슈팅 2: 남의 확장이 있어야만 동작하던 버그
역시 사용자 제보였습니다. boj-extended가 켜져 있을 때만 정상 동작한다는 것이었습니다. 단독으로 쓰는 사람에게는 그래프가 아예 나오지 않았습니다.
DOM 조작 쪽을 먼저 의심했는데 문제가 없었습니다. 범위를 좁혀 보니 데이터 요청 단계에서 응답을 받지 못하고 있었습니다. 다른 확장이 요청 헤더를 건드려 준 덕분에 우연히 통과하고 있었던 것입니다.
요청 헤더를 직접 맞춰 보내도록 바꿔 다른 확장 없이도 동작하게 했습니다.
이 버그의 교훈은 “내 환경에서 되는 것”이 근거가 아니라는 것이었습니다. 제가 백준을 쓸 때 boj-extended를 켜 두고 있었기 때문에, 개발하는 내내 한 번도 실패를 보지 못했습니다.
왜 멈췄나
기능을 지탱하던 BOJ 채점 서비스가 중단되면서 데이터 출처가 사라졌습니다. BOJ는 채점 서비스와 함께 돌아오겠다고 안내하고 있어, 새 서비스가 열리면 호환성을 확인한 뒤 운영 재개 여부를 판단할 예정입니다.
기술 스택
JavaScriptChart.jsChrome Extension