[#22859] HTML 파싱
문제
#22859 HTML 파싱
Gold 3
적용 알고리즘: Implementation 알고리즘
풀이 방법
- while 문을 /main 태그를 만날 때까지 진행
- 입력받은 문자열을 리스트로 바꾸고, 이를 슬라이싱 하고 join하여 사용
- 문장의 좌우 공백을 지우는 함수: strip()
- 두개 이상의 공백 제거 -> 문자열을 split후 “ “.join()으로 합치기
- 태그를 만난 경우, 인덱스를 이동해줌
코드 흐름
- p 태그 내의 불필요한 태그 제거
- p 태그 안의 문장의 좌우 공백 제거
- 전체 코드에서 공백이 두개 이상 오는 경우 하나로 치환
- while 문을 돌며 한 문장씩 출력
코드
html = input()
html = list(html)
sub_tag_open = 0
idx = 0
# 1. <p> 태그 내부의 불필요한 태그 제거
# </main>을 마주친 경우 반복문 종료
while ("".join(html[idx:idx + 8]) != "</main>"):
# <p> 태그 식별
if ("".join(html[idx:idx + 3]) == "<p>"):
idx += 3 # <p> 태그 내부 문장부터 시작
while ("".join(html[idx:idx + 4]) != "</p>"):
if (html[idx] == "<"):
sub_tag_open = 1
elif (html[idx] == ">"):
sub_tag_open = 0
html[idx] = ""
if (sub_tag_open == 1):
html[idx] = ""
idx += 1
idx += 1
# 2. 두개 '이상'의 공백 제거
sentence = "".join(html)
# html = sentence.replace(" ", " ")
html = " ".join(sentence.split())
idx = 0
title = ""
sent = ""
# 출력
# 3. <p> 태그 내부 문장의 좌우 공백 제거
while ("".join(html[idx:idx + 8]) != "</main>"):
if ("".join(html[idx:idx + 4]) == "<div"):
idx += 12
while (html[idx] != '"'):
title += html[idx]
idx += 1
print("title : " + title)
title = ""
if ("".join(html[idx:idx + 3]) == "<p>"):
idx += 3
while ("".join(html[idx:idx + 4]) != "</p>"):
sent += html[idx]
idx += 1
sen = sent.strip()
print(sen)
sent = ""
idx += 1
체감 난이도: 4.6/5
출력 형식이 잘못되었습니다. 가 뜨는데 이게 출력 형식은 유사한데 공백이나 개행?이 틀려서 뜨는 거란다. 와 진짜 어딜 봐도 왜 뭐가 잘못되었는지 모르겠다. 진짜 하…
아 설마 문장에서 공백이 2개 ‘이상’으로 오는 경우의 처리때문에…?
[맞았습니다!!!]
와 진짜 공백이 2개 ‘이상’ «– 이거때문에 그런거였음. replace로 두개의 공백을 처리했는데 세개 이상 오는 경우에는 처리가 되지 않았음. 와 지금 생각해보니 이게 문제일 것이라는 생각을 어떻게 했을까. 와 채점 퍼센트 올라가다가 맞았다고 뜨니까 진짜 너무 소름돋는다. 공백 2개 이상을 하나로 만들기 위해
- html 리스트 안의 문자들을 join 하여 하나의 string으로 만들어서 sentence에 저장
- sentence를 split()함수를 사용하여 단어마나 분리하고, 이를 “ “로 join함
이 전략을 사용하였다. 시간은 조금 걸렸지만 승부욕이 돋아서 계속 도전하길 잘한거 같다. 와 진짜 인간승리다.
[문제 풀이 아이디어]
- 문장에서 태그 식별하기: ““.join(html[idx:idx + 8]) != “여는태그/main닫는태그”
- 문장 양쪽의 공백 제거: sen.strip()