BOJ Performance

백준 채점 현황에서 내 코드의 성능 위치를 그래프로 보여주는 브라우저 확장

운영 중단Chrome 설치 381건

기간
2026. 1. ~ 2026. 5.
역할
1인 개발 및 운영

AS-IS → TO-BE

AS-IS

  • problem_id 만 보고 전체 AC 결과를 수집
  • 진행 중인 대회에서도 남의 제출 통계가 노출
  • 타 확장이 켜져 있어야만 데이터 요청이 통과

TO-BE

  • contest_id 를 감지하면 확장이 동작하지 않음
  • 대회 중에는 통계를 보여주지 않음
  • 요청 헤더를 직접 맞춰 단독으로 동작

BOJ 채점 서비스가 중단되어 운영을 함께 중단했습니다. 서비스가 돌아오면 호환성을 확인한 뒤 운영 재개 여부를 판단합니다.

서비스

백준에서 문제를 풀면 실행 시간과 메모리가 숫자로만 나옵니다. 그 숫자가 좋은 건지 나쁜 건지는 알 수 없습니다.

LeetCode가 제출 결과를 분포 그래프로 보여주는 것을 보고 같은 것을 백준에 붙였습니다. 채점 현황 페이지에서 전체 제출자 분포 안의 내 위치를 막대 그래프로 보여줍니다.

실행 시간·메모리 분포와 내 위치

Chrome·웨일·Firefox 세 스토어에 배포했습니다. Chrome 웹 스토어에서 설치 381건, 운영 기간 내 주간 사용자 지표 최고 59명을 기록했습니다. 설치 건수에는 운영 중단 이후 설치도 포함됩니다. 코드 성능을 비교하는 도구를 혼자 개발·배포하고, 설치와 스토어 유입을 통해 수요를 확인한 프로젝트입니다.

배포·운영 성과

Chrome 웹 스토어의 설치·제거·사용자 CSV를 내려받아 2025년 9월 12일~2026년 9월 11일의 1년을 조회했습니다. 실제 통계는 2026년 2월 3일부터 발생합니다. 아래 수치는 Chrome만 대상으로 하며, 웨일·Firefox 지표는 합산하지 않았습니다.

지표 확인한 값
설치 381건 · 운영 중단 이후 포함
운영 기간 내 주간 사용자 지표 최고치 59명 · 2026년 3월 29일
주간 사용자 지표 최신값 26명 · 2026년 9월 11일
제거 56건 · 2026년 9월 10일까지

설치는 고유 사용자 수가 아닌 건수입니다. 설치와 제거의 차이를 현재 사용자 수로 보거나, 제거를 설치로 나눠 이탈률로 해석하지 않았습니다.

2~4월 설치는 192건이었습니다. 월별 주간 사용자 지표 최고치는 2월 48명에서 3월 59명으로 올랐다가 4월 51명, 5월 39명으로 줄었습니다. 사용자 지표의 감소가 5월 이전부터 시작됐으므로, 하락을 전부 운영 중단 때문이라고 설명할 수는 없습니다.

운영을 중단한 5월에는 설치 61건이 발생했습니다. 정확한 중단일이 없어 이달 수치를 중단 전후로 나누지는 않았습니다. 중단한 달 이후인 6월부터 9월 11일까지의 설치는 128건으로 전체의 약 33.6%입니다. 따라서 전체 381건을 운영 중 확보한 설치 성과로 제시하지 않았습니다.

운영 중단 이후에도 설치와 주간 사용자 지표가 남아 있지만, 실제 기능 사용이나 서비스 유지율을 뜻하지는 않습니다. 사용자 CSV에서 9월 9~10일은 0으로 기록되어 있어, 실제 감소인지 집계 문제인지 확인하기 전에는 최근 평균의 의미를 단정하기 어렵습니다.

웨일에서도 다운로드 107건

웨일 스토어에서는 2026년 9월 13일 확인 기준 다운로드 107건을 기록했습니다. Chrome의 설치 381건과는 집계 기준이 다른 별도 지표이며, 운영 중단 이후에 확인한 누적 수치입니다. 현재 수치만으로 다운로드 시점이나 유입 원인, 실제 기능 사용 여부를 판단할 수는 없습니다.

Chrome 외에도 웨일·Firefox의 스토어 심사를 거쳐 배포했습니다. Firefox는 이용 규모보다 여러 브라우저에 맞춰 확장을 배포한 경험으로 정리했습니다.

백준에서 들어온 방문이 가장 많았다

GA4로 2026년 1월 1일~9월 13일의 스토어 방문·설치 이벤트도 확인했습니다.

지표 확인한 값
스토어 방문 사용자 150명
방문 세션 201회
백준 경유 세션 83회 · 전체의 41.3%
GitHub 경유 세션 13회
install 이벤트 64건 · 사용자 54명

백준이 가장 큰 유입 경로였고, 전체 참여 세션의 61.7%도 백준 경유 방문이었습니다. 백준 사용자를 위한 확장이 실제로 해당 사이트에서 스토어 유입을 얻었다는 근거입니다. 다만 어느 게시글이나 링크를 통해 들어왔는지, 각 유입 경로가 설치로 얼마나 이어졌는지는 확인하지 못했습니다.

GA4에는 보고서 필터링이 적용되어 있고 웹 스토어 CSV와 조회 기간도 다릅니다. 따라서 install 이벤트 64건은 웹 스토어 설치 381건과 별개의 지표로 봤습니다. 관측된 방문 사용자 중 설치 이벤트가 있는 사용자 비율은 36%(54/150)이지만, 이를 전체 방문자의 설치 전환율로 일반화하지 않았습니다.

이 분석은 스토어 방문과 설치까지를 다룹니다. 확장 내부의 그래프 기능 사용량이나 유지율을 측정한 것은 아니므로, 성과는 설치 규모와 유입 경로를 중심으로 정리했습니다.

만들면서 정한 것

비교 대상을 같은 언어로 한정

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

프로젝트 목록으로