
스도쿠 리그
제이위드미 (개인사업자), 2026.07 ~ 진행 중 · 기획, 개발, 스토어 심사, 운영
1:1 대결 대기열 진입 314번 중 매칭 11번
배경
풀이 기법을 배우고 그 실력으로 실시간 랭크 대전을 하는 스도쿠 앱입니다. 개발 시작 1개월 만에 양대 스토어에 올렸고 출시 한 달에 가입자 600명과 다운로드 1,000회를 기록했습니다. 만드는 동안 스도쿠 카페에 진행 상황을 계속 올렸는데 색상 테마와 기법 설명 방식은 거기서 받은 의견을 반영했습니다.
문제
출시 뒤 1:1 랭크 대결의 매칭이 거의 성사되지 않았습니다. 대기열에 들어온 314번 중 매칭은 11번(3.5%)이었고, 매칭된 경우에도 평균 760초를 기다려야 했습니다. 처음에는 같은 티어끼리만 매칭되는 조건 때문이라고 봤습니다. 기능이 빠르게 늘면서 이미 만든 게 틀어지는 일도 잦아졌습니다. 보드의 난이도를 매기는 프로그램과 힌트 프로그램의 판단이 달라도 에러가 나지 않았고, 랭크 대전인데 앱 화면에서만 점수를 검사하면 서버에 직접 요청을 보내 그 검사를 건너뛸 수 있었습니다.
판단
먼저 매칭 범위를 인접 티어까지 넓히고 오래 기다리면 한 번 더 넓히도록 서버 설정값을 바꿨지만 매칭률은 그대로였습니다. 시간대별 대기열 진입 인원을 세어 보니 조건보다 같은 시간대에 들어오는 사용자 자체가 적은 것이 병목이었습니다. 그래서 대결 시간을 피크타임으로 정해 사용자를 모으고, 누군가 대기열에 들어오면 앱에 접속해 있는 사용자에게 알림이 뜨게 했습니다. 두 엔진의 판단이 어긋나는 문제는 보드를 만들 때마다 두 프로그램을 같이 돌려 결과가 다르면 실패하는 테스트로 막았고, 점수 검사 같은 핵심 검증은 서버 함수와 RLS 정책으로 옮겼습니다. Apple 영수증은 루트 인증서까지 서버에서 검증합니다.
결과
피크타임과 대기열 알림을 넣은 뒤 대기열 진입 105번 중 30번이 매칭돼 성공률이 3.5%에서 28.6%로 올랐고, 평균 대기는 760초에서 10.5초로 줄었습니다. 개발을 시작한 지 1개월 만에 App Store와 Google Play에 올렸습니다. 스도쿠 카페에 진행 상황을 올리며 모은 사용자가 출시 1주에 300명, 한 달에 600명이 됐습니다. 다운로드 1,000회를 달성했고 DAU 80으로 우상향해 App Store 보드 게임 순위 34위까지 올라갔습니다.
개선 전
개선 후
1:1 매칭 성공률
평균 매칭 대기
개선 전
개선 후
개선 전
개선 후
최고 난이도는 다음 퍼즐 시작까지 2분 이상 대기
문제
개발 중 가장 어려운 난이도를 직접 플레이해 보니 다음 퍼즐이 나오기까지 한참을 기다려야 했습니다. 퍼즐의 난이도를 판정하려면 후보 보드를 여러 번 풀어 봐야 하다 보니, 상위 난이도는 PC에서도 퍼즐 하나에 평균 30초, 최대 124초가 걸렸습니다. 이 때 시작 버튼을 누르면 화면이 멈춘 채로 생성이 끝나기를 기다리는 구조였습니다.
판단
그래서 퍼즐을 누른 뒤에 만들지 않고 미리 만들어 두기로 했습니다. 난이도 6개마다 퍼즐을 3개씩 큐에 쌓아 두고, 남은 퍼즐이 1개 이하가 되면 백그라운드 Isolate에서 다시 채웁니다. 큐는 기기에 저장해 앱을 다시 켜도 유지되고, 처음 설치한 기기는 큐가 비어 있기 때문에 난이도별 퍼즐 3개를 앱에 넣어 배포했습니다. 여러 난이도를 동시에 만들면 CPU와 배터리를 많이 쓰기 때문에 쉬운 난이도부터 하나씩 채우도록 했습니다. 이후 생성 방식을 목표 난이도를 넘으면 바로 중단하고 다시 시도하는 방식으로 교체했고, 난이도 채점 솔버는 칸마다 Set으로 관리하던 후보 숫자를 비트마스크로 전환해 다시 구현했습니다.
결과
다음 퍼즐은 큐에서 꺼내기 때문에 생성을 기다리지 않고 바로 시작합니다. 같은 PC, 같은 시드로 다시 측정해 보니 상위 난이도의 최대 생성 시간이 124초에서 2.4초로 줄었습니다. 그중 비트마스크 솔버만의 효과는 최고 난이도 평균 1.59초에서 0.49초로 약 3배 단축입니다.
리플레이 한 판 기법 분석에 145초 소요
문제
리플레이는 플레이어가 둔 수마다 어떤 기법으로 둔 것인지 분석해 보여 줍니다. 다이아 난이도 86수짜리 판 하나를 분석하는 데 145초가 걸렸고, 한 수에 143초를 쓰고도 답을 찾지 못하는 경우가 있었습니다. 체인 계열 기법으로 둔 수는 "설명되지 않아요"로 나오기도 했습니다.
판단
AI가 제안한 기존 방식은 플레이어가 지운 후보마다 그 소거의 이유가 되는 기법을 역으로 찾는 방식이었습니다. 찾지 못하면 가능한 탐색을 끝까지 다 돌다 보니 시간이 오래 걸렸습니다. 그래서 질문을 거꾸로 바꿨습니다. 그 자리에서 쓸 수 있는 기법을 한 번에 뽑아 두고 플레이어의 수와 대조하는 방식입니다. 탐색 횟수에 상한을 두고, 지운 후보가 전부 설명되면 그 자리에서 멈추도록 했습니다.
결과
같은 판의 분석 시간이 145초에서 1.2~2.8초로 줄었고, 엔진이 설명할 수 있는 수 중 설명하지 못하는 수는 0개가 되었습니다. 뽑아 둔 기법 목록으로 수마다 쓸 수 있었던 다른 기법을 보여 주는 "다른 길" 기능도 만들었습니다. 다음 날 리플레이를 열면 기기가 뜨거워지는 것을 발견해 원인을 찾아 보니, 미리 계산이 판 끝까지 연쇄로 돌아 84회 실행에 CPU 5.8초를 쓰고 있었습니다. 다음 한 칸만 미리 계산하도록 수정해 4회 실행, 0.2초로 줄였습니다.
iPad
- Flutter
- Supabase
- PostgreSQL