2 minute read

문제

#22859 HTML 파싱
Gold 3
적용 알고리즘: Implementation 알고리즘


풀이 방법

  • while 문을 /main 태그를 만날 때까지 진행
  • 입력받은 문자열을 리스트로 바꾸고, 이를 슬라이싱 하고 join하여 사용
  • 문장의 좌우 공백을 지우는 함수: strip()
  • 두개 이상의 공백 제거 -> 문자열을 split후 “ “.join()으로 합치기
  • 태그를 만난 경우, 인덱스를 이동해줌

코드 흐름

  1. p 태그 내의 불필요한 태그 제거
  2. p 태그 안의 문장의 좌우 공백 제거
  3. 전체 코드에서 공백이 두개 이상 오는 경우 하나로 치환
  4. 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개 이상을 하나로 만들기 위해

  1. html 리스트 안의 문자들을 join 하여 하나의 string으로 만들어서 sentence에 저장
  2. sentence를 split()함수를 사용하여 단어마나 분리하고, 이를 “ “로 join함

이 전략을 사용하였다. 시간은 조금 걸렸지만 승부욕이 돋아서 계속 도전하길 잘한거 같다. 와 진짜 인간승리다.


[문제 풀이 아이디어]

  • 문장에서 태그 식별하기: ““.join(html[idx:idx + 8]) != “여는태그/main닫는태그”
  • 문장 양쪽의 공백 제거: sen.strip()