관리 메뉴

솜씨좋은장씨

[BaekJoon] 6581번 : HTML (Python) 본문

Programming/코딩 1일 1문제

[BaekJoon] 6581번 : HTML (Python)

솜씨좋은장씨 2023. 2. 26. 15:46
728x90
반응형

코딩 1일 1문제! 오늘의 문제는 백준의 HTML 입니다.

 

6581번: HTML

원래의 HTML 문서가 입력으로 주어진다. 이 텍스트는 단어와 HTML 태그들로 이루어져 있으며, 태그는 한 개 이상의 공백문자나 탭, 개행 문자 등으로 구분된다. 단어는 연속된 알파벳, 숫자, 또는

www.acmicpc.net

👨🏻‍💻 문제 풀이

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))
 

GitHub - SOMJANG/CODINGTEST_PRACTICE: 1일 1문제 since 2020.02.07

1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.

github.com

Comments