4 분 소요

백준에서 제출한 문제중 로컬에 저장하지 않은 문제 찾기

1.아이디어

최근 골드랭크 달성을 위해 문제를 마구잡이로 풀다보니 종종 제출한 문제들을 로컬에 저장하지 않았다. 이런 문제들을 찾아보자.

처음 생각한 과정은 다음과 같았다.

start
a=백준의 정답처리된 문제 모으기
b=로컬의 저장된 문제 모으기
c=a-b 차집합계산
c에서 가장 최근 정답처리된 소스코드 저장
end

그러나 백준에서 recaptcha를 사용하므로 웹드라이버를 통해 로그인하는 과정에서 막히게될것이므로 사용자 인증이 필요없는 범위 내에서 해결해야했다. 정답처리된 코드를 조회하는것은 사용자 인증이 필요하다.

따라서 최종적으로는 이러한 과정을 수행하는 스크립트를 작성하게되었다.

start
a=백준의 정답처리된 문제 모으기
b=로컬의 저장된 문제 모으기
c=a-b 차집합계산
c에있는 문제의 웹페이지 주소 출력
end

2.구현

사용된 패키지는 로컬 탐색에os, 문자열처리에 re, 웹드라이버 구동용selenium이다.

os.listdir를 사용하여 테스트 해보았는데 하위폴더의 코드를 못 찾는 문제가 발생하여 이를 해결하기 위해 os.walk를 사용하여 모든 폴더에서 파일을 찾았다.

결과적으로 git폴더까지 뒤지는 바람에 커밋해시에서 쓸데없는 값이 잔뜩 저장되긴했으나 이로 문제가 생길확률은 매우 낮고 저녁약속전까지 만드는게 목표라 무시했다(….). 차후 문제가 생기면 (dirs)=="git"인경우 continue를 사용하는걸로 해결하면 될것같다.


2022-08-05 업데이트

- os대신 glob를 사용해 코드의 간결성을 개선
- selenium4에서 find_element_by_xpath를 지원하지 않아 `백준의 풀이한 문제 저장`부분을 업데이트 하였다.


from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
import glob
import re

#크롬드라이버
driverLOC='수정하여 사용(예: D:/chromedriver.exe'
#백준문제폴더
loc='수정하여 사용 (예: D:/backjoon'
#백준ID
ID='수정하여 사용 (예: yourID'

#로컬의 풀이한 문제저장
numbers = re.findall(r'\d+', str(glob.glob(loc+'**',recursive=True)))

#백준의 풀이한 문제저장
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
service = ChromeService(executable_path=driverLOC)
driver = webdriver.Chrome(service=service, options=options)
driver.get('https://www.acmicpc.net/user/'+ID)
passBuffer=driver.find_element(By.XPATH,"/html/body/div[2]/div[2]/div[3]/div[2]/div/div[2]/div[2]/div[2]/div").text.split()
driver.close()

#로컬에 없는 문제주소 출력
unlocaled=list((set(passBuffer)-set(numbers)))
for i in range(len(unlocaled)):
    print('https://www.acmicpc.net/problem/'+str(unlocaled[i]))
    print()

구버전(셀레니움 버전 3) gist링크

3.결과

asd

6개의 문제가 출력되었다. 테스트용으로 1000번(a+b….)문제를 풀고 직접 비교한 결과 정확하다. 확인결과 한문제 빼고 javascript를 배울때 문법숙달상 풀어본 문제뿐이라 그냥 커밋하지 않기로했다..

결과: 나름 꾸준히 커밋했음!

댓글남기기