LearningCollector: 백준 문제 번호 추출 로직 개선
이번 커밋에서는 백준 문제 풀이 시, 폴더명에서 문제 번호를 추출하지 못할 경우 README.md 파일을 파싱하여 문제 번호를 가져오는 로직을 추가했습니다.
LearningCollector: 백준 문제 번호 추출 로직 개선
이번 커밋에서는 백준 문제 풀이 시, 폴더명에서 문제 번호를 추출하지 못할 경우 README.md 파일을 파싱하여 문제 번호를 가져오는 로직을 추가했습니다.
요약
이번 작업은 core/github_collector.py 파일에서 이루어졌습니다. 백준 문제 풀이 경로에서 문제 번호를 추출하는 데 실패했을 때, README.md 파일에서 문제 번호를 파싱하는 대체 로직을 구현했습니다. 이 변경은 2026년 1월 31일에 이루어졌으며, 프로젝트 LearningCollector의 claude/setup-rpi-cron-job-yccvq 브랜치에서 진행되었습니다.
배경 및 목적
프로젝트에서 백준 문제 풀이를 수집하는 과정 중, 특정 폴더 구조에서는 문제 번호를 직접적으로 추출하기 어려운 경우가 발생했습니다. 예를 들어, "백준/Silver I/곱셈/" 과 같이 폴더명에 문제 번호가 포함되지 않은 경우입니다. 이러한 상황에서 문제 풀이 데이터를 정확하게 수집하기 위해서는 다른 방법을 모색해야 했습니다. 이 작업의 목적은 이러한 예외적인 경우에도 백준 문제 번호를 안정적으로 추출하여 데이터 수집의 정확성을 높이는 것입니다.
구현 내용
주요 변경사항은 core/github_collector.py 파일 내에서 백준 문제 번호를 추출하는 부분입니다. 기존에는 폴더명을 직접 파싱하여 문제 번호를 얻었지만, 이제는 이 과정이 실패할 경우 README.md 파일의 내용을 분석하여 문제 번호를 찾아냅니다. README.md 파일은 " # [티어] 문제명 - 번호" 와 같은 형식으로 문제 번호가 포함되어 있다고 가정하고 파싱 로직을 구현했습니다.
변경된 파일 목록:
core/github_collector.py
핵심 코드 설명 (예상)
# ... 기존 코드 ... def extract_baekjoon_problem_number(folder_path): # 폴더명에서 직접 문제 번호 추출 시도 problem_number = try_extract_from_folder_name(folder_path) if problem_number is None: # 폴더명에서 추출 실패 시 README.md 파싱 시도 readme_content = read_readme_file(folder_path) problem_number = try_extract_from_readme(readme_content) return problem_number def try_extract_from_readme(readme_content): # README.md 내용에서 "# [티어] 문제명 - 번호" 형식 파싱 # 정규표현식 등을 사용하여 번호 추출 # ... pass # ... 나머지 코드 ...(위 코드는 이해를 돕기 위한 예시이며, 실제 구현과 다를 수 있습니다.)
기술적 의사결정
이번 작업에서는 README.md 파일에서 문제 번호를 추출하기 위해 **정규 표현식(Regular Expression)**을 사용하는 방식을 고려했습니다.
선택 이유:
README.md파일의 제목 형식인 "# [티어] 문제명 - 번호"는 비교적 일관된 패턴을 가지고 있습니다. 정규 표현식은 이러한 패턴을 효율적으로 매칭하고 원하는 정보(문제 번호)를 추출하는 데 매우 강력한 도구입니다.다른 대안:
- 문자열 슬라이싱 및 검색: 간단한 문자열 함수를 사용하여
#이후의 텍스트를 찾고,-를 기준으로 분리하는 방식도 가능합니다. - 별도의 파싱 라이브러리: Markdown 파서를 사용하여
.md파일을 구조적으로 분석하는 방법도 고려할 수 있습니다.
- 문자열 슬라이싱 및 검색: 간단한 문자열 함수를 사용하여
정규 표현식 선택의 장단점:
- 장점:
- 다양한 형식의 제목 패턴에 대한 유연한 대응이 가능합니다.
- 하나의 정규 표현식으로 문제 번호를 추출할 수 있어 코드 간결성을 유지할 수 있습니다.
- 대부분의 프로그래밍 언어에서 기본적으로 지원하거나 쉽게 사용할 수 있습니다.
- 단점:
- 복잡한 정규 표현식은 가독성이 떨어질 수 있으며, 디버깅이 어려울 수 있습니다.
README.md파일의 형식이 예상과 크게 다를 경우, 정규 표현식을 수정해야 할 수 있습니다.
- 장점:
간단한 패턴 매칭에는 문자열 함수로도 충분할 수 있지만, 잠재적인 README.md 형식의 변화에 대비하고 좀 더 견고한 솔루션을 만들기 위해 정규 표현식을 선택했습니다.
배운 점 및 개선점
이번 작업을 통해 파일 경로뿐만 아니라 파일 내용에서도 필요한 정보를 추출하는 방법을 익힐 수 있었습니다. 특히, 예상치 못한 데이터 형식에 대비하여 대체 로직을 마련하는 것의 중요성을 다시 한번 느꼈습니다.
배운 점:
- 예외 상황에 대한 Robustness(견고성) 확보의 중요성.
- 텍스트 패턴 매칭을 위한 정규 표현식 활용법.
- Git 커밋 메시지에 문제 해결의 배경과 방법을 명확히 기록하는 습관.
개선점:
README.md파일의 제목 형식이 변경될 경우를 대비하여, 정규 표현식을 좀 더 일반화하거나, 여러 패턴을 시도하는 로직을 추가하는 것을 고려할 수 있습니다.- 현재는
README.md파일 하나만 파싱하지만, 만약 문제가 되는 경우가 더 많다면, 다른 파일(예:main.py내 주석)에서도 문제 번호를 추출하는 방안을 고려해볼 수 있습니다.
다음 단계 계획:
- 추가적인 백준 문제 풀이 데이터에 대해 이번 로직이 잘 동작하는지 테스트를 진행합니다.
- 만약 다른 종류의 예외 케이스가 발견된다면, 이를 해결하기 위한 추가적인 로직을 개발하거나 기존 로직을 개선합니다.
참고 자료
- https://claude.ai/code/session_01NwgAwJKWQMKn72TvKHgQwA (이 커밋이 생성된 Claude 세션 링크)