[백준] 19818 LaTeX Expert (파이썬), 정규 표현식

파이썬/코딩테스트|2023. 11. 4. 10:00

https://www.acmicpc.net/problem/19818

 

19818번: LaTeX Expert

Input contains the text of the work that consists of lowercase and uppercase English letters, ends of lines, spaces, <<.>>, <<,>>, <<'>> (ASCII code 39) characters and \cite{ } constructions. Here is a nonempty string of lowercase English letters that has

www.acmicpc.net

정규표현식을 사용해서 풀면 되는 문제다. 문제 자체가 '\cite{onegin}' 같은 형식으로 주어지기 때문에 정규표현식을 떠올리기도 쉽고 문제 자체도 풀이를 떠올리기 쉬웠다.

 

 

import sys
import re

is_text = True
p = re.compile(r'\{(.+?)\}')
now_order, correct_order = [], []
bib_dic = {}

for line in sys.stdin.readlines():
    line = line.rstrip() # 라인 A
    if line == '\\begin{thebibliography}{99}':
        is_text = False

    if is_text:
        cites = p.findall(line)
        for cite in cites:
            correct_order.append(cite)
    else:
        cites = p.findall(line)
        for cite in cites:
            now_order.append(cite)
            bib_dic[cite] = line

# 입력된 bib에는 thebib, 99, ~~, thebib이 들어있음.
if now_order[2:-1] == correct_order:
    print('Correct')
else:
    print('Incorrect')
    print('\\begin{thebibliography}{99}')
    for i in correct_order:
        sys.stdout.write(bib_dic[i]+'\n')
    print('\\end{thebibliography}')

입력의 길이가 주어지지 않기 때문에 readlines()로 입력을 받아준다.
text와 bib 항목을 구별하기 위해 is_text 플래그를 만든다.
p.findall(line)을 통해 onegin, dubrovsky, saltan 등을 찾고 현재 순서 혹은 올바른 순서 리스트에 넣어준다.
현재 순서와 올바른 순서가 동일하다면 correct를 출력한다. 다르다면 올바른 순서에 맞춰서 출력해준다.

이때 출력해야할 것은 onegin이 아닌 \bibitem{onegin} A.S.Pushkin. Eugene Onegin. 1831.이다. 딕셔너리 형태로 dic[onegin] = \bibitem{onegin} A.S.Pushkin. Eugene Onegin. 1831. 로 저장하고 마찬가지로 꺼내준다.

초기에는 라인 A의 rstrip 없이 문제를 풀었었다. 오류가 발생했는데 디버깅에 시간이 상당히 소요되었다. 'sys.stdin.readlines()에는 \n이 들어있고 맨 마지막 줄에는 \n이 없다'라고 알고 있고 실제로도 그러한데 어째선지 백준 채점 방식에서는 마지막 줄에도 \n이 붙어있다. 다음부터는 안전하게 습관적으로 rstrip을 붙이는 게 나을 듯하다.

댓글()