[JAVA] 백준 6581번 : HTML

2025. 7. 4. 14:48·Algorithm

[6581번 : HTML] - Gold5


[ 문제 ]

오로지 <br>, <hr> 태그와 그 외 평문으로만 주어지는 HTML 문서가 있을 때, 그 결과를 보여주는 코드를 작성하시오.

 

한 줄에는 80자보다 많은 글자가 출력되어서는 안 된다.


[ 입력 ]

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

 

  • 단어는 연속된 알파벳, 숫자, 또는 문장 부호들이다.
    • 예를 들어, "abc,123"은 하나의 단어이지만, "abc, 123"은 "abc,", "123" 두 단어이다.
  • 단어는 항상 80글자 이하이며, '<'나 '>'를 포함하지 않는다.
  • 입력에 등장하는 태그는 <br>과 <hr> 외에는 없다.

[ 출력 ]

다음과 같은 규칙에 맞게 출력해야 한다.

 

  • 이번에 출력할 단어를 출력하고 나서도 현재 줄이 80글자를 넘지 않으면 현재 줄에 출력해도 좋다. 단, 80글자를 넘어가게 된다면 새로운 줄에 출력해야 한다.
  • <br> 태그를 읽게 되면, 새 줄을 시작한다.
  • <hr> 태그를 읽게 되면, 이미 줄의 첫 부분이 아니라면 새 줄을 시작한 뒤, '-'를 한 줄에 80글자를 입력한다. 그 후 다시 새 줄을 시작한다.

마지막 줄은 개행 문자로 끝난다.

여러 개의 연속된 개행 문자, 공백 문자, 탭 문자는 하나의 공백문자로 출력한다.

[ # 예제 입력 1 ]
Hallo, dies ist eine 
ziemlich lange Zeile, die in Html
aber nicht umgebrochen wird.
<br>
Zwei <br> <br> produzieren zwei Newlines. 
Es gibt auch noch das tag <hr> was einen Trenner darstellt.
Zwei <hr> <hr> produzieren zwei Horizontal Rulers.
Achtung       mehrere Leerzeichen irritieren

Html genauso wenig wie


mehrere Leerzeilen.

[ # 예제 출력 1 ]
Hallo, dies ist eine ziemlich lange Zeile, die in Html aber nicht umgebrochen
wird.
Zwei

produzieren zwei Newlines. Es gibt auch noch das tag
--------------------------------------------------------------------------------
was einen Trenner darstellt. Zwei
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
produzieren zwei Horizontal Rulers. Achtung mehrere Leerzeichen irritieren Html
genauso wenig wie mehrere Leerzeilen.

[ Code ]

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String str;
        StringBuilder sb = new StringBuilder();
        int curWord = 0;

        while ((str = br.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(str);

            while (st.hasMoreTokens()) {
                String cur = st.nextToken();
                int wordCnt = cur.length();

                if (cur.equals("<br>")) {
                    sb.append("\n");
                    curWord = 0;
                    continue;
                } else if (cur.equals("<hr>")) {
                    if (curWord != 0) {
                        curWord = 0;
                        sb.append("\n");
                    }
                    sb.append("--------------------------------------------------------------------------------\n");
                    continue;
                }

                if (curWord == 0) {
                    sb.append(cur);
                    curWord = wordCnt;
                } else if (curWord + 1 + wordCnt > 80) {
                    sb.append("\n").append(cur);
                    curWord = wordCnt;
                } else {
                    sb.append(" ").append(cur);
                    curWord += wordCnt + 1;
                }
            }
        }

        if (sb.charAt(sb.length() - 1) != '\n') {
            sb.append("\n");
        }
        bw.write(sb.toString());
        bw.close();
    }
}
  • curWord : 현재 줄의 글자 개수
  • wordCnt : 현재 단어의 글자 개수
  • StringTokenizer로 공백 제거하여 토큰 생성
  • StringBuilder에 출력할 내용 전부 담기
  • 현재 단어 `<br>` : 줄바꿈을 추가하고 현재 줄의 글자 개수를 초기화한다.
  • 현재 단어 `<hr>` : 현재 줄의 단어가 존재한다면 줄바꿈을 한 후 "-" 출력, 현재 줄에 글자가 존재하지 않다면 "-" 바로 출력
  • 현재 줄의 글자가 하나도 없다면 (`curWord == 0`) : 현재 단어 바로 출력, curWord를 wordCnt로 초기화
  • `현재 줄의 글자 개수 + 공백 + 현재 단어의 글자 개수 > 80` : 줄바꿈 한 후 현재 단어 출력, curWord를 wordCnt로 초기화
  • `현재 줄의 글자 개수 + 공백 + 현재 단어의 글자 개수 <= 80` : 공백 출력 후 현재 단어 출력, curWord를 wordCnt + 공백으로 초기화
  • 출력 조건에서 마지막 줄은 개행 문자로 끝내라 했으니, 마지막 단어가 `\n` 가 아니라면 개행을 추가한 후 출력한다.

 

 

처음엔 `StringTokenizer` 대신, `split(" ")`으로 썼는데, 공백이 여러 개 일 때 제대로 작동하지 않아서 변경하였다.

`split(" ")` 은 공백 문자가 아니라 스페이스 하나 기준이다.

반응형

'Algorithm' 카테고리의 다른 글

[JAVA] 백준 11265번 : 끝나지 않는 파티  (1) 2025.07.29
[JAVA] 백준 21610번 : 마법사 상어와 비바라기  (3) 2025.07.23
[JAVA] 백준 5427번 : 불  (1) 2025.07.03
[JAVA] 백준 14267번 : 회사 문화 1  (0) 2025.07.02
[JAVA] 백준 16918번 : 봄버맨  (1) 2025.06.27
'Algorithm' 카테고리의 다른 글
  • [JAVA] 백준 11265번 : 끝나지 않는 파티
  • [JAVA] 백준 21610번 : 마법사 상어와 비바라기
  • [JAVA] 백준 5427번 : 불
  • [JAVA] 백준 14267번 : 회사 문화 1
ssu_dev
ssu_dev
  • ssu_dev
    ssu
    ssu_dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (98)
      • Cloud (10)
      • HCI (2)
      • Algorithm (54)
      • Programming (13)
      • Computer Science (5)
      • System (6)
      • Trouble Shooting (6)
      • Work (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 인기 글

  • 태그

    priorityqueue
    node scaling
    sort
    OS
    자료구조
    Stack
    docker
    Pod Scheduling
    Java
    BOJ
    EKS
    K8s
    Karpenter
    Deque
    플로이드 워셜
    투포인터
    구현
    dfs
    cs
    bfs
  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
ssu_dev
[JAVA] 백준 6581번 : HTML
상단으로

티스토리툴바