Skip to content

알고리즘 패턴 태깅 #4

@sounmind

Description

@sounmind

개요

DaleStudy/leetcode-study 저장소에 올라오는 PR의 각 솔루션 파일을 OpenAI로 분석하여, 해당 파일에 사용된 알고리즘 패턴을 PR 파일 코멘트(line comment)로 자동으로 남긴다.

배경

현재 PR에는 언어 레이블(py, java, ts 등)만 자동으로 붙는다. 스터디원들이 서로의 코드를 리뷰할 때 어떤 알고리즘 패턴을 사용했는지 한눈에 파악할 수 있도록, 파일 단위로 패턴 분석 결과를 코멘트로 제공한다.

트리거

  • pull_request 이벤트의 opened, synchronize 액션 (PR 생성 및 커밋 push 시마다 실행)
  • 동일 파일에 Bot이 이전에 작성한 패턴 태그 코멘트가 있으면 삭제 후 새로 작성
  • 다른 사람이 남긴 코멘트는 절대 삭제하지 않음

동작 방식

1. 변경 파일 수집

PR에서 변경된 파일 목록을 GitHub REST API로 조회한다.

GET /repos/DaleStudy/leetcode-study/pulls/{pr_number}/files
  • {problem-name}/{username}.{extension} 패턴의 파일만 처리
  • ADDED, MODIFIED 상태인 파일만 대상 (삭제된 파일 제외)

2. 파일별 OpenAI 분석

각 파일의 내용을 가져와 OpenAI API로 분석한다.

분석 요청 내용:

  • 파일 전체 코드
  • 문제 이름 (폴더명, 예: best-time-to-buy-and-sell-stock)

감지 대상 알고리즘 패턴 (예시):

  • Two Pointers
  • Sliding Window
  • Fast & Slow Pointers
  • BFS
  • DFS
  • Backtracking
  • Dynamic Programming
  • Binary Search
  • Monotonic Stack
  • Heap / Priority Queue
  • Hash Map / Hash Set
  • Greedy
  • Divide and Conquer
  • Union Find
  • Trie
  • Bit Manipulation

3. PR 파일 코멘트 작성

분석 결과를 해당 파일의 첫 번째 줄에 PR review comment로 작성한다.

코멘트 형식 (예시):

<!-- dalestudy-pattern-tag -->
### 🏷️ 알고리즘 패턴 분석

- **패턴**: Sliding Window, Hash Map
- **설명**: 윈도우 내 최댓값을 추적하기 위해 Deque를 활용한 슬라이딩 윈도우 기법을 사용했습니다.
  • HTML 주석 <!-- dalestudy-pattern-tag -->를 포함하여 Bot이 작성한 코멘트를 식별
  • 동일 파일에 Bot이 작성한 기존 패턴 태그 코멘트만 삭제 후 새로 작성
  • 다른 사람이 남긴 코멘트는 건드리지 않음

구현 위치

  • 핸들러: handlers/tag-patterns.js (신규 생성)
  • 엔드포인트: 웹훅에서 내부 호출 (별도 REST 엔드포인트 불필요)
  • 웹훅 연동: handlers/webhooks.js에서 pull_request 이벤트의 opened / synchronize 액션 시 호출

필요한 GitHub App 권한

  • pull_requests: write (이미 있음 - review comment 작성에 사용)
  • contents: read (이미 있음 - 파일 내용 조회)

필요한 Secrets

  • OPENAI_API_KEY (이미 등록됨)

스킵 조건

  • maintenance 라벨이 붙은 PR
  • Draft 상태의 PR
  • 변경 파일이 {problem-name}/{username}.{extension} 패턴이 아닌 경우 (예: README, 설정 파일)

응답 형식 (웹훅 처리 결과 로그)

{
  "action": "tag-patterns",
  "pr": 1970,
  "files_analyzed": 3,
  "files_skipped": 1,
  "results": [
    { "file": "sliding-window-maximum/juhui-jeong.java", "patterns": ["Sliding Window", "Monotonic Stack"], "commented": true },
    { "file": "coin-change/juhui-jeong.java", "patterns": ["Dynamic Programming"], "commented": true }
  ]
}

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