[Gold I] Title: 최종 순위, Time: 900 ms, Memory: 159464 KB -BaekjoonHub #62
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 | |
| # Git 설정 먼저 실행 | |
| git config --global user.email "github-actions[bot]@users.noreply.github.com" | |
| git config --global user.name "Wiki Bot" | |
| # [중요] 동기화 문제 해결: 원격 저장소의 최신 변경사항(이미 추가된 날짜 등)을 가져옴 | |
| git pull origin main --rebase | |
| TODAY=$(date '+%Y.%m.%d') | |
| # [중요] 검색 조건 완화: "- **날짜**" 전체가 아니라 "날짜" 텍스트만 있어도 있는 것으로 간주 | |
| # 이렇게 하면 공백이나 특수문자 때문에 못 찾는 경우를 방지함 | |
| if grep -q "$TODAY" README.md; then | |
| echo "Date header exists. Appending only links." | |
| cat wiki_log.txt >> README.md | |
| else | |
| echo "Date header does not exist. Creating header and appending links." | |
| # 파일 끝에 빈 줄이 없을 수 있으므로 강제 개행 | |
| echo "" >> README.md | |
| echo "- **$TODAY**" >> README.md | |
| cat wiki_log.txt >> README.md | |
| fi | |
| git add README.md | |
| git commit -m "Docs: Update README with new Wiki links [skip ci]" | |
| git push | |
| fi |