[ 문제 ]
오로지 <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 |