요 며칠간 다시 백준을 풀면서 같이 벨로그에도 기록하는 중인데 마크다운 쓰는게 여간 귀찮은 일이었다. 문제도 긁어와야하고.. 문제 번호도 일일히 입력하고.. 풀이도 써야하고.. 근데 여기서 문제랑 문제 번호는 긁어올 수 있지 않나?!
그래서 큰 틀을 짜주는 프로그램을 만들었다!
지금까지는 같이 만들거나 도움받아서 개발해왔는데, 처음으로 누구의 도움도 없이(구글은 빼고) 무언가 나에게서 결과물이 나와서 기분이 좋다..ㅎㅎ (파이썬 크롤링 기초도 몰랐기에 꽤 고생했지만..)
물론 예외처리는 물론이고 콘솔창에 입력하는 등.. 투박하기도 하고 문제도 많지만.. 뭐 그건 미래의 내가 할거니까!
간단하게 코드 살짝 올리면서 짧게 마무리하겠다
from urllib.request import urlopen, Request
import re
def write_file(problem_number: int) -> None:
f = open("text.txt", "w", encoding="utf8")
# Input problem number and get data
url = "https://www.acmicpc.net/problem/" + str(problem_number)
req = Request(url, headers={"User-Agent": "Mozilla/5.0"})
html = urlopen(req)
boj_contents = str(html.read().decode("utf8"))
# Get text
TITLE_REGULAR_EXPRESSION = "(<title>)([\w\W]+)(</title>)"
boj_title = re.findall(TITLE_REGULAR_EXPRESSION, boj_contents)[0][1].split(": ")[1]
velog_title = f"[백준 Python] {problem_number}번 {boj_title}"
main_contents = f"[백준 {problem_number} {boj_title}]({url})"
PROBLEM_REGULAR_EXPRESSION = "(<h2>문제)([\s\S]+?)(</section>)"
problem = re.findall(
"(<p>)([\s\S]+?)(</p>)",
re.findall(PROBLEM_REGULAR_EXPRESSION, boj_contents)[0][1],
)
INPUT_REGULAR_EXPRESSION = "(<h2>입력)([\s\S]+?)(</section>)"
input_ = re.findall(
"(<p>)([\s\S]+?)(</p>)",
re.findall(INPUT_REGULAR_EXPRESSION, boj_contents)[0][1],
)
OUTPUT_REGULAR_EXPRESSION = "(<h2>출력)([\s\S]+?)(</section>)"
output = re.findall(
"(<p>)([\s\S]+?)(</p>)",
re.findall(OUTPUT_REGULAR_EXPRESSION, boj_contents)[0][1],
)
f.write(velog_title + "\n\n")
f.write("백준\npython\n\n")
f.write(main_contents + "\n\n")
f.write("## 문제\n")
for p in problem:
f.write(p[1] + "\n\n")
f.write("## 입력\n")
for i in input_:
f.write(i[1] + "\n\n")
f.write("## 출력\n")
for o in output:
f.write(o[1] + "\n\n")
f.write("## 풀이 및 회고\n")
f.write("### 풀이\n\n")
f.write("### 회고\n\n")
f.write("## 코드\n```python\n\n```\n")
f.write(
f"[>> iwtkmn0219의 Github <<](https://github.com/iwtkmn0219/boj/blob/main/python/{problem_number}.py)"
)
f.close()
print("문제 번호를 입력하세요:", end=" ")
write_file(int(input()))
입력: 14003
[백준 Python] 14003번 가장 긴 증가하는 부분 수열 5
백준
python
[백준 14003 가장 긴 증가하는 부분 수열 5](https://www.acmicpc.net/problem/14003)
## 문제
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {<strong>10</strong>, <strong>20</strong>, 10, <strong>30</strong>, 20, <strong>50</strong>} 이고, 길이는 4이다.
## 입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 A<sub>i</sub>가 주어진다. (-1,000,000,000 ≤ A<sub>i</sub> ≤ 1,000,000,000)
## 출력
첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
둘째 줄에는 정답이 될 수 있는 가장 긴 증가하는 부분 수열을 출력한다.
## 풀이 및 회고
### 풀이
### 회고
## 코드
\```python
\```
[>> iwtkmn0219의 Github <<](https://github.com/iwtkmn0219/boj/blob/main/python/14003.py)