Skip to content

[Silver III] Title: N번째 큰 수, Time: 792 ms, Memory: 276144 KB -Baekjoo… #49

[Silver III] Title: N번째 큰 수, Time: 792 ms, Memory: 276144 KB -Baekjoo…

[Silver III] Title: N번째 큰 수, Time: 792 ms, Memory: 276144 KB -Baekjoo… #49

name: Auto-generate Wiki Page for AC/PS
on:
push:
branches: [ main ]
workflow_dispatch:
jobs:
build-wiki:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout Main Repo
uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Get newly added README.md files
id: get_files
run: |
git config core.quotePath false
FILES=$(git diff --name-only --diff-filter=A HEAD~1 HEAD | grep -E "^(백준|프로그래머스)/.*/README.md$" || true)
echo "Found new files: $FILES"
echo "files=$FILES" >> $GITHUB_OUTPUT
- name: Checkout Wiki Repo
if: steps.get_files.outputs.files != ''
uses: actions/checkout@v4
with:
repository: ${{ github.repository }}.wiki
path: wiki
token: ${{ secrets.WIKI_TOKEN }}
- name: Generate and Commit to Wiki
if: steps.get_files.outputs.files != ''
run: |
touch wiki_log.txt
while IFS= read -r FILE_PATH; do
[ -z "$FILE_PATH" ] && continue
echo "--- Processing: $FILE_PATH ---"
PLATFORM=$(echo "$FILE_PATH" | cut -d'/' -f1)
DIR_PATH=$(dirname "$FILE_PATH")
# README 첫 줄 파싱
TITLE_LINE=$(head -n 1 "$FILE_PATH" | sed 's/^# //')
# 난이도 추출
DIFFICULTY=$(echo "$TITLE_LINE" | grep -o '\[.*\]' | head -n 1)
DIFFICULTY_CLEAN=$(echo "$DIFFICULTY" | sed 's/\[//g' | sed 's/\]//g')
# 문제 번호 추출
PROBLEM_NUM=$(echo "$TITLE_LINE" | grep -oE '[0-9]+' | tail -n 1)
# [수정 1] 문제 이름 추출 시 앞뒤 공백(xargs) 제거 및 정규식 보완
# sed -E "s/ - ${PROBLEM_NUM}\s*$//" : 숫자 뒤에 공백이 있어도 처리하도록 \s* 추가
PROBLEM_NAME=$(echo "$TITLE_LINE" | sed -E 's/^\[.*\] //' | sed -E "s/ - ${PROBLEM_NUM}.*$//" | xargs)
PROBLEM_LINK=""
if [ "$PLATFORM" == "백준" ]; then
PROBLEM_LINK="https://www.acmicpc.net/problem/$PROBLEM_NUM"
elif [ "$PLATFORM" == "프로그래머스" ]; then
PROBLEM_LINK="https://school.programmers.co.kr/learn/courses/30/lessons/$PROBLEM_NUM"
fi
SOLUTION_FILE_NAME=$(find "$DIR_PATH" -maxdepth 1 \( -name "*.java" -o -name "*.py" -o -name "*.cpp" -o -name "*.js" \) -exec basename {} \; | head -n 1)
ENCODED_DIR_PATH=$(echo "$DIR_PATH" | sed 's/ /%20/g')
ENCODED_FILE_NAME=$(echo "$SOLUTION_FILE_NAME" | sed 's/ /%20/g')
SOLUTION_LINK="https://github.com/${{ github.repository }}/blob/main/${ENCODED_DIR_PATH}/${ENCODED_FILE_NAME}"
WIKI_PAGE_TITLE="[$PLATFORM] $DIFFICULTY_CLEAN. $PROBLEM_NAME"
# 1. 대괄호 제거
# 2. 공백을 -로 변경
# 3. 연속된 -(--)를 하나(-)로 변경 (squeeze)
# 4. 맨 앞이나 맨 뒤에 있는 - 제거
SAFE_FILENAME=$(echo "$WIKI_PAGE_TITLE" | sed 's/\[//g' | sed 's/\]//g' | sed 's/ /-/g' | sed 's/-\+/-/g' | sed 's/^-\|-$//g')
WIKI_FILE_NAME="${SAFE_FILENAME}.md"
WIKI_FILE_PATH="./wiki/$WIKI_FILE_NAME"
# URL에는 .md가 들어가지 않음
WIKI_FULL_URL="https://github.com/${{ github.repository }}/wiki/$SAFE_FILENAME"
echo "Creating Wiki Page: $WIKI_PAGE_TITLE"
echo "Safe Filename: $SAFE_FILENAME"
{
echo "### 1. 풀이 시간"
echo "- (여기를 수정하세요)"
echo ""
echo "### 2. 난이도"
echo "- 유형: (여기를 수정하세요)"
echo "- 풀이법: ✅ 15분 이내 ⬜ 15분 이상"
echo "- 구현: ⬜ 30분 이내 ⬜ 30분 이상"
echo "- 총평: ⬜ Easy ⬜ Normal ⬜ Hard ⬜ Hell"
echo ""
echo "### 3. 문제 설명"
echo "- (여기를 수정하세요)"
echo ""
echo "### 4. 접근 방법"
echo "- 사용 알고리즘: (여기를 수정하세요. ex. \`DFS\`)"
echo "- (여기를 수정하세요)"
echo ""
echo "### 5. 배운 점 / 느낀 점"
echo "- (여기를 수정하세요)"
echo ""
echo "<br>"
echo ""
echo "> [문제 링크]($PROBLEM_LINK) <br>"
echo "> [My Solution Code]($SOLUTION_LINK)"
} > "$WIKI_FILE_PATH"
echo " - [$WIKI_PAGE_TITLE]($WIKI_FULL_URL)" >> wiki_log.txt
done <<< "${{ steps.get_files.outputs.files }}"
- name: Push changes to Wiki
if: steps.get_files.outputs.files != ''
run: |
cd wiki
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git config --global user.name "Wiki Bot"
git add .
if ! git diff-index --quiet HEAD; then
git commit -m "Auto-generate wiki page(s) for new solution(s) [skip ci]"
git push
else
echo "No new wiki pages to commit."
fi
- name: Update Main README
if: steps.get_files.outputs.files != ''
run: |
if [ -s wiki_log.txt ]; then
TODAY=$(date '+%Y.%m.%d')
HEADER="- **$TODAY**"
# grep -F: 고정 문자열 검색 (특수문자 무시)
# README.md가 끝에 줄바꿈이 없을 경우를 대비해 tail로 확인하지 않고 전체 검색
if grep -Fq "$HEADER" README.md; then
echo "Date header '$HEADER' exists. Appending links."
cat wiki_log.txt >> README.md
else
echo "Date header '$HEADER' not found. Creating new block."
# 파일 끝에 강제로 줄바꿈 추가 (안전장치)
echo "" >> README.md
echo "$HEADER" >> README.md
cat wiki_log.txt >> README.md
fi
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git config --global user.name "Wiki Bot"
git add README.md
git commit -m "Docs: Update README with new Wiki links [skip ci]"
git push
fi