← 개발 로그 목록

LearningCollector: 백준 문제 번호 추출 로직 개선

/ 6분 분량 / 개발 로그

이번 커밋에서는 백준 문제 풀이 시, 폴더명에서 문제 번호를 추출하지 못할 경우 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 내 주석)에서도 문제 번호를 추출하는 방안을 고려해볼 수 있습니다.
  • 다음 단계 계획:

    • 추가적인 백준 문제 풀이 데이터에 대해 이번 로직이 잘 동작하는지 테스트를 진행합니다.
    • 만약 다른 종류의 예외 케이스가 발견된다면, 이를 해결하기 위한 추가적인 로직을 개발하거나 기존 로직을 개선합니다.

참고 자료