일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 더현대서울 맛집
- AI 경진대회
- 캐치카페
- github
- 프로그래머스
- ChatGPT
- 금융문자분석경진대회
- 자연어처리
- Real or Not? NLP with Disaster Tweets
- hackerrank
- PYTHON
- Baekjoon
- Docker
- 파이썬
- 데이콘
- 프로그래머스 파이썬
- Git
- programmers
- Kaggle
- dacon
- 백준
- 편스토랑
- 코로나19
- 우분투
- SW Expert Academy
- ubuntu
- 편스토랑 우승상품
- gs25
- leetcode
- 맥북
- Today
- Total
솜씨좋은장씨
[BaekJoon] 6581번 : HTML (Python) 본문
코딩 1일 1문제! 오늘의 문제는 백준의 HTML 입니다.
👨🏻💻 문제 풀이
1. HTML 텍스트 입력 받기
original_html_text = []
while True:
try:
html_line = input()
original_html_text.append(html_line)
except EOFError:
break
original_html_text = "\n".join(original_html_text)
먼저 while 반복문과 EOF Error 를 활용하여
HTML 을 한 줄 씩 입력 받아 original_html_text 리스트에 담고
이를 개행문자("\n") 로 join 하여 HTML 텍스트로 만들어줍니다.
2. HTML 문서에서 존재하는 줄바꿈은 의미가 없으므로 줄바꿈을 모두 공백으로 치환합니다.
html_text = " ".join(original_html_text.split("\n"))
3. <br> / <hr> 태그를 주어진 규칙대로 치환합니다.
def replace_tag_to_str(html_text):
tag_replace_map = {
"<br>": "\n",
"<hr>": f"{'-' * 80}\n"
}
split_line = [tag_replace_map[word] if word in tag_replace_map else word for word in html_text.split(" ")]
return ' '.join(split_line)
<br> 은 HTML 에서 줄바꿈을 의미하므로 -> \n 로
<hr> 은 문제에서 "-" 가 80개 이어진 문자열이라고 했으므로 -> "-" * 80 으로
치환합니다.
이를 위해 tag_replace_map 을 만들었습니다.
tag_replace_map = {
"<br>": "\n",
"<hr>": f"{'-' * 80}\n"
}
입력받은 html_text 를 공백으로 split 한 다음 해당 단어를 하나씩 꺼내오는 반복문을 돌면서
꺼내온 단어가 tag_replace_map 에 있는 단어이면 해당 값을 key 로 꺼내온 값으로 치환하도록 한 다음
다시 공백으로 join 합니다.
split_line = [tag_replace_map[word] if word in tag_replace_map else word for word in html_text.split(" ")]
' '.join(split_line)
4. 한 줄에는 최대 80자 까지만 출력하도록 줄바꿈 기준 각 라인별로 후처리를 진행합니다.
def split_text_len_80(text):
if len(text) <= 80:
return text
new_text = []
temp = []
for word in text.split():
if len(" ".join(temp)) < 80:
temp.append(word)
if len(" ".join(temp)) >= 80:
pop = temp.pop()
new_text.append(" ".join(temp))
temp = [pop]
if temp:
new_text.append(" ".join(temp))
return "\n".join(new_text)
replaced_html = []
for line_text in replaced_html_text.split("\n"):
line_text = " ".join(line_text.split())
replaced_html.append(split_text_len_80(text=line_text))
줄바꿈을 기준으로 split 하여 각 라인별 text 를 가져오고
split() -> " ".join 으로 2개 이상 공백문자를 하나로 바꾸는 작업을 진행합니다.
for line_text in replaced_html_text.split("\n"):
line_text = " ".join(line_text.split())
def split_text_len_80(text):
if len(text) <= 80:
return text
new_text = []
temp = []
for word in text.split():
if len(" ".join(temp)) < 80:
temp.append(word)
if len(" ".join(temp)) >= 80:
pop = temp.pop()
new_text.append(" ".join(temp))
temp = [pop]
if temp:
new_text.append(" ".join(temp))
return "\n".join(new_text)
한 라인에 80자 까지만 남기기 위해서
각 라인의 text 를 공백 단위로 split 해서 나온 단어에서 하나씩 꺼내와서
길이가 80 보다 작을경우에 temp 리스트에 넣다가
new_text = []
temp = []
for word in text.split():
if len(" ".join(temp)) < 80:
temp.append(word)
길이가 80보다 커지는 경우 temp 에서 마지막 단어를 pop 하고
new_text 리스트에 다시 공백 기준으로 temp 리스트를 join 하여 넣고
temp 리스트는 pop하여 나온 값만 남긴 리스트로 변환합니다.
if len(" ".join(temp)) >= 80:
pop = temp.pop()
new_text.append(" ".join(temp))
temp = [pop]
마지막으로 temp 리스트에 남아있는 단어가 있다면! new_text 리스트에 공백으로 join 한 값을 넣어줍니다.
if temp:
new_text.append(" ".join(temp))
5. 마지막으로 위 과정을 거친 라인들을 다시 줄바꿈을 기준으로 join 하여 Return 하면 끝!
"\n".join(replaced_html)
👨🏻💻 코드 ( Solution )
def replace_tag_to_str(html_text):
tag_replace_map = {
"<br>": "\n",
"<hr>": f"{'-' * 80}\n"
}
split_line = [tag_replace_map[word] if word in tag_replace_map else word for word in html_text.split(" ")]
return ' '.join(split_line)
def split_text_len_80(text):
if len(text) <= 80:
return text
new_text = []
temp = []
for word in text.split():
if len(" ".join(temp)) < 80:
temp.append(word)
if len(" ".join(temp)) >= 80:
pop = temp.pop()
new_text.append(" ".join(temp))
temp = [pop]
if temp:
new_text.append(" ".join(temp))
return "\n".join(new_text)
def HTML(original_html_text):
replaced_html = []
html_text = " ".join(original_html_text.split("\n"))
replaced_html_text = replace_tag_to_str(
html_text=html_text
)
for line_text in replaced_html_text.split("\n"):
line_text = " ".join(line_text.split())
replaced_html.append(split_text_len_80(text=line_text))
return "\n".join(replaced_html)
if __name__ == "__main__":
original_html_text = []
while True:
try:
html_line = input()
original_html_text.append(html_line)
except EOFError:
break
original_html_text = "\n".join(original_html_text)
print(HTML(original_html_text=original_html_text))
'Programming > 코딩 1일 1문제' 카테고리의 다른 글
[Programmers] 피자 나눠 먹기 (3) (Python) (0) | 2023.02.28 |
---|---|
[Programmers] 문자열 계산하기 (Python) (0) | 2023.02.27 |
[Programmers] 7의 개수 (Python) (0) | 2023.02.25 |
[Programmers] 짝수 홀수 개수 (Python) (0) | 2023.02.23 |
[Programmers] 명예의 전당 (1) (Python) (0) | 2023.02.22 |