blog.yoouyeon
about/tags
Back to blog
Oct 25, 2025

쾌적한 알고리즘 풀이 환경 만들기

by 유연

들어가며

알고리즘 문제를 꾸준히 풀려고 노력하는 중이다. 그런데 문득 혼자서 풀다 보니 생각이 좀 고이는 느낌이 들었다. 알고리즘 스터디를 구할 수도 있었지만 부담 없이 공부하는 게 더 중요했다. 왠지 스터디에 참여하는 순간 알고리즘 공부가 부담이 될 것 같았다.

그래서 문제를 풀고 나면 Claude에게 코드를 보여주고 피드백을 받곤 했다. 비효율적인 부분이나 세련되지 않은 부분이 있는지를 주로 물었고 꽤 도움이 되었다. 그런데 이게 점점 번거로워지기 시작했다. 매번 코드를 복사해서 붙여넣고, 질문하고, 답변받는 과정을 반복하다 보니 문득 '이거 코드 리뷰랑 똑같은데?' 하는 생각이 들었다. 그래서 어차피 Github에 풀이 코드를 올리고 있으니 PR을 만들어서 자동으로 리뷰받으면 좋겠다고 생각했다. 여러 AI 코드리뷰 툴들이 있었는데 나는 오픈소스 컨트리뷰션 아카데미에서 봤던 PR-Agent를 사용하기로 했다.

그런데 막상 PR을 올리려고 하다 보니 PR을 일일이 만드는 것이 생각보다 귀찮은 일이었다. 사실 알고리즘 문제 풀이는 코드만 올라가 있으면 되는데 브랜치를 만들고, PR을 만들고 하는 과정이 좀 번거롭게 느껴졌다. 그래서 코드를 푸시하면 → PR이 만들어지고 → AI가 코드 리뷰를 남겨주고 → 확인 후에 머지하는 워크플로우를 GitHub Actions로 구성해보기로 했다. ✨

설계하기

설계한 워크플로우는 다음과 같다.

workflow flowchart

그리고 자동화할 작업들은 다음과 같다.

이 작업들을 자동화하면 직접 해야 할 일은 "문제 풀고 → 푸시 → 리뷰 확인 → 라벨 달기" 이렇게 4가지 꼭 필요하고 간단한 작업들만 남게 된다!

단계별 구현

PR 자동 생성

upload 브랜치에 푸시하면 자동으로 PR이 생성되도록 했다.

steps:
- name: Check existing PR (upload -> main)
id: find-pr
uses: actions/github-script@v8
with:
script: |
const prs = await github.rest.pulls.list({
owner, repo,
state: 'open',
head: headRef,
base: baseRef,
});
core.setOutput('exists', (prs.data.length > 0).toString());
- name: Create PR
if: steps.find-pr.outputs.exists != 'true'
env:
GH_TOKEN: ${{ secrets.ASSISTANT_GITHUB_TOKEN }}
run: |
gh pr create \
--head ${{ env.HEAD_BRANCH }} \
--base ${{ env.BASE_BRANCH }} \
--title "${TODAY} 문제 풀었어요" \
--body "오늘도 멋져요 👍✨"

PR을 생성하기 전에 이미 열려있는 PR이 있는지를 먼저 체크한다. 하루 동안 푼 풀이를 하나의 PR로 함께 올리는 방식이기 때문에, PR을 올린 뒤에 문제를 더 푸는 상황이나 코드 리뷰를 반영하는 상황을 고려한 것이다.

PR 생성은 GitHub 기본 봇 계정을 사용해도 되지만, 나중에 PR 히스토리를 봤을 때 봇 계정만 가득 차 있으면 왠지 보기 안 좋을 것 같아서 GH_TOKEN을 따로 지정해주었다. 그리고 메인 계정을 쓰면 깃허브 친구들의 대시보드에 자동 PR이 계속 뜨게 될텐데 그게 좀 민망해서 부계정 토큰을 사용했다.

PR-Agent로 코드 리뷰

코드 리뷰는 PR-Agent를 이용하기로 했다. 무료이기도 하고, 다른 프로젝트에서 이미 CodeRabbit이라는 다른 코드 리뷰 툴을 써봤어서 이번에는 새로운 툴을 한번 써보고 싶었다. 여러 LLM을 지원하기도 하고, 설정 문서도 나름 자세히 되어 있어서 좋았다. 나는 Claude를 주로 쓰고 있어서 Anthropic API를 연결해서 썼다.

steps:
- name: PR Agent
uses: qodo-ai/pr-agent@main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ANTHROPIC.KEY: ${{ secrets.ANTHROPIC_KEY }}
github_action_config.auto_review: "true"
github_action_config.auto_describe: "true"
github_action_config.auto_improve: "true"
github_action_config.pr_actions: '["opened","reopened","ready_for_review","review_requested"]'

자동 리뷰와 코드 설명, 그리고 개선 제안을 해 주는 옵션 모두를 켜주었고, 좀 더 세부적인 설정은 pr_agent.toml 파일에서 정의했다. 여기서 코드 리뷰나 개선 관련 프롬프트를 설정할 수 있다. (자세한 설정과 사용 경험은 AI 코드 리뷰 도구 활용기에서 다뤘다.)

실제로 받은 리뷰는 이런 식이다. (PR 링크)

PR-Agent review comment

PR-Agent improve comment

라벨로 머지하기

리뷰를 확인하고 더 이상 수정할 일이 없을 때 ready-to-merge 라벨을 달아서 머지할 수 있게 했다. 물론 내가 직접 머지해도 괜찮지만 라벨을 이용해서 액션을 트리거하는 것을 한번 해보고 싶기도 했고 (사실 이게 가장 큰 이유이긴 하다.) 부계정이 만든 PR이기 때문에 부계정으로 머지하는게 좀 더 괜찮지 않을까 싶어서 라벨을 이용했다.

on:
pull_request:
types: [labeled]
jobs:
auto-merge-check:
name: Ready check & Merge
if: >
github.event.label.name == 'ready-to-merge' &&
github.event.pull_request.draft == false
steps:
# ...
- name: Merge PR
run: |
gh pr merge ${{ github.event.pull_request.number }} \
--auto \
--rebase

머지 방식은 커밋 히스토리를 깔끔하게 유지하고 싶고 꼬일 일이 거의 없기 때문에 rebase 방식을 선택했다. 그런데 rebase 방식을 사용하니 commit 작성자와 머지한 사람이 달라져 author와 committer가 따로 표시되어서 좀 지저분해 보인다. 조금 후회 중... 🥺

브랜치 동기화

머지한 이후에는 upload 브랜치를 업데이트해줬다. rebase 방식으로 머지했기 때문에 upload 브랜치에 있던 커밋과 main에 새로 푸시된 커밋이 달라져서 그대로 쓸 수 없기도 한데, 또 매번 PR을 만들기 전에 새로 upload 브랜치를 만들어주는 것도 번거로웠기 때문이다.

# 머지 이후에 upload를 main으로 동기화
jobs:
sync-upload:
if: >
github.event.pull_request.merged == true &&
github.event.pull_request.base.ref == 'main' &&
github.event.pull_request.head.ref == 'upload'
runs-on: ubuntu-latest
steps:
- name: Sync upload to main
run: |
git fetch origin main --prune
# main을 기준으로 로컬 upload 브랜치를 재생성 (있으면 덮어씌우기)
git switch -C upload origin/main
git push --force-with-lease origin upload

머지 이후에 브랜치를 삭제하도록 설정해두어서 기본적으로는 upload 브랜치를 새로 만들지만, 혹시 모를 상황을 대비해서 upload 브랜치가 존재하는 경우에는 --force-with-lease로 덮어씌우도록 했다. 이렇게 하면 다음 번에 문제를 풀 때에 upload 브랜치가 이미 준비되어 있어서 바로 코드를 푸시하면 된다.

끝!

알고리즘 공부를 오래 해왔지만, 개인적으로는 매번 할 일 우선순위에서 밀리는 조금은 귀찮은 일 중 하나였다. 그렇기 때문에 정말 부담 없이 할 수 있어야 했다. Claude에게 코드를 복사해서 개선점을 물어보는 것이 점점 귀찮아지고 일도 많아지는 것 같았는데 그래도 이렇게 귀찮은 일을 자동화해두니 루틴만 지키면 되고 알고리즘 공부에만 집중할 수 있어서 만족도가 엄청 높다. 이렇게 시간을 들여 자동화를 해 둔 만큼 꾸준히 알고리즘 문제를 풀 수 있기를 바란다...

end