Skip to content

개인화된 솔루션 제공 #6

@soobing

Description

@soobing

개요

PR을 열거나 코드를 푸시할 때마다, 해당 멤버의 전체 학습 현황을 시각화한 댓글을 PR에 자동으로 작성(또는 업데이트)한다.
AI 분석을 통해 이번 주 제출한 풀이가 문제의 의도한 유형에 맞는지 분석하고, 주차별 누적 데이터를 기반으로 성장 패턴과 반복 약점을 함께 제공한다.


트리거

  • pull_request 이벤트: opened, reopened, synchronize
  • 기존 handlePullRequestEvent에서 synchronize 액션을 추가로 처리

데이터 소스

1. 문제 카테고리 매핑 파일

leetcode-study 레포에 problem-categories.json 파일을 추가하여 관리한다.

{
  "two-sum": {
    "difficulty": "Easy",
    "categories": ["Array", "Hash Table"],
    "intended_approach": "Hash Map을 사용해 O(n)으로 풀어야 합니다"
  },
  "group-anagrams": {
    "difficulty": "Medium",
    "categories": ["Array", "Hash Table", "String"],
    "intended_approach": "정렬 또는 문자 카운팅으로 키를 만들어 Hash Map에 그룹핑합니다"
  }
}
  • 레포에 있는 문제 폴더 기준으로 초기 파일 생성 (총 ~75개 문제)
  • 이후 문제가 추가될 때 함께 관리

2. 유저의 전체 풀이 이력

GitHub API로 레포 내 */username.* 파일 목록을 조회해 누적 풀이 문제를 파악한다.

GET /repos/DaleStudy/leetcode-study/git/trees/main?recursive=1
→ two-sum/soobing.ts, group-anagrams/soobing.py ... 필터링

3. 이번 PR에서 제출한 문제

PR의 변경 파일 목록으로 확인한다.

GET /repos/DaleStudy/leetcode-study/pulls/:pr_number/files
→ word-break/soobing.ts, coin-change/soobing.ts ...

4. AI 유형 분석

이번 PR의 diff를 문제별로 분리해, 각 풀이가 intended_approach에 맞는지 OpenAI로 분석한다.

5. 유저별 누적 학습 데이터 (GitHub PR history)

별도 저장소 없이 GitHub API로 매번 계산한다. 유저의 merged PR 목록을 조회해 주차별 제출 문제를 파악하고, 파일 트리와 mapping 파일로 누적 현황을 산출한다.

# 유저의 merged PR 목록 조회
GET /repos/DaleStudy/leetcode-study/pulls?state=closed&per_page=100
→ PR 작성자 필터링 + merged 여부 확인

# PR별 변경 파일로 제출 문제 파악
GET /repos/DaleStudy/leetcode-study/pulls/:pr_number/files
→ word-break/soobing.ts ... → 문제명 추출

1차 구현 범위

  • 누적 풀이 문제 수, 카테고리별 진행도: 레포 파일 트리 + mapping 파일로 계산
  • 이번 주 유형 일치율: 현재 PR diff → AI 분석 (당주 결과만 표시)
  • 유형 일치율 추이, 성장 패턴, 반복 약점: 과거 데이터 저장 없이는 계산 불가 → 2차에서 추가

2차 최적화 (예정)

  • Cloudflare KV 또는 사용자별 JSON 파일로 주차별 분석 결과 누적 저장
  • 추이 계산 및 성장 패턴, 반복 약점 표시 활성화

댓글 형식

## 📊 soobing 님의 학습 현황

### 이번 주 제출 문제
| 문제 | 난이도 | 유형 분석 |
|---|---|---|
| word-break | Medium | ⚠️ 유형 불일치 |
| coin-change | Medium | ✅ 의도한 유형 |
| two-sum | Easy | ✅ 의도한 유형 |

### 누적 학습 요약
- 풀이한 문제: 23 / 75개
- 이번 주 유형 일치율: 75% (3문제 중 2문제 일치)

### 문제 풀이 현황
| 카테고리 | 진행도 | 완료 |
|---|---|---|
| Array | ■■■□□□□ | 3 / 7 (Easy 2, Medium 1) |
| Hash Table | ■■□□□ | 2 / 5 (Easy 1, Medium 1) |
| Dynamic Programming | □□□□□□ | 0 / 11 ← 아직 시작 안 함 |
| Tree | ■■■■□□ | 4 / 6 (Easy 2, Medium 2) |

누적 통계 계산 방식

항목 계산 방법
유형 일치율 추이 이전 주차 match_rate → 현재 주차 match_rate
가장 성장한 패턴 직전 주차 대비 불일치 → 일치로 전환된 카테고리
반복되는 약점 2주 이상 연속으로 불일치가 발생한 카테고리 + 누적 불일치 횟수

구현 포인트

github 레포 (Cloudflare Worker)

  1. handlers/webhooks.js: handlePullRequestEventsynchronize 액션 추가
  2. handlers/learning-status.js (신규): 학습 현황 조회, AI 분석, 댓글 작성 로직
  3. utils/prReview.js: 문제별 유형 일치 분석 함수 추가
  4. 댓글 업데이트: 기존 학습 현황 댓글이 있으면 새로 작성하지 않고 edit

leetcode-study 레포

  1. problem-categories.json (신규): 문제별 난이도, 카테고리, 의도 유형 매핑 파일 추가

처리 흐름

pull_request (opened / synchronize)
  ↓
PR 작성자 username, Week 추출
  ↓
problem-categories.json 로드 (GitHub API)
  ↓
레포 전체 파일 트리에서 username 풀이 파일 조회 → 누적 풀이 현황 계산
  ↓
이번 PR 변경 파일 조회 → 이번 주 제출 문제 목록 확인
  ↓
이번 주 문제별 diff → OpenAI로 유형 일치 분석
  ↓
현황 댓글 작성 or 업데이트 (Bot 댓글 식별 후 edit)

제외 범위 (1차)

  • 유형 일치율 추이, 성장 패턴, 반복 약점 (누적 저장 없이 계산 불가 → 2차)
  • 문제 추천 기능
  • maintenance 라벨 PR은 스킵 (기존 로직과 동일)

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

Status

In Progress

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions