baekjoon(Java)
[BOJ] 백준 17413 단어 뒤집기 2 (Java)
bak_ssso
2022. 1. 8. 01:40
https://www.acmicpc.net/problem/17413
17413번: 단어 뒤집기 2
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져
www.acmicpc.net
문제
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
- 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
- 문자열의 시작과 끝은 공백이 아니다.
- '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.
태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.
입력
첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.
출력
첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.
성공코드
// 2022.01.08.토
import java.io.*;
public class BOJ17413 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
String str = br.readLine();
String sbStr;
// '<' 기호 안에 있는 글자인지 확인하기 위한 boolean 변수
boolean check = false;
// 한글자씩 확인
for (int i = 0; i < str.length(); i++) {
// '<' 기호가 나오면 뒤집지 않고 정상적으로 출력해야함
if (str.charAt(i) == '<') {
check = true;
// 이전에 sb에 저장된 값이 있다면 ( sb의 길이가 0이 아니라면 )
if (sb.length() != 0) {
// sbStr에 sb를 뒤집은 문자열을 저장
sbStr = sb.reverse().toString();
bw.write(sbStr);
// sb를 비워줌
sb.setLength(0);
}
// 그 후 자신도 bw에 write
bw.write(str.charAt(i));
continue;
}
// '>' 기호가 나오면 =
else if (str.charAt(i) == '>') {
bw.write(str.charAt(i));
// check를 false로 만들어서 정상출력하는 구간이 종료되었음을 표시
check = false;
continue;
}
// '<>' 사이에 있는 문자가 아니고 공백을 만났을 때
// 공백을 기준으로 sb에 저장된 문자열을 뒤집어서 출력해야함
// 추가로 설명하자면 '<>' 사이에 있는 문자는 공백을 상관하지 않고 bw.write()하기 때문에 신경쓸 필요가 없음
else if (!check && str.charAt(i) == ' ') {
sbStr = sb.reverse().toString();
bw.write(sbStr);
// sb에 저장된 문자열을 뒤집어서 bw.write() 해준 후 자기 자신(공백)도 bw.write()
bw.write(" ");
// sb를 비워줌
sb.setLength(0);
continue;
}
// '<>' 사이에 존재하는 문자라면 바로 bw.write()
if (check) {
bw.write(str.charAt(i));
}
// '<>' 사이에 존재하는 문자가 아니고 공백이 아니라면 (알파벳 소문자 or 숫자)
else {
// 뒤집어서 출력해야하므로 sb에 저장
sb.append(str.charAt(i));
}
}
// sb에 저장된 값이 있다면 뒤집어서 bw.write()
if (sb.length() != 0) {
sbStr = sb.reverse().toString();
bw.write(sbStr);
}
bw.flush();
}
}
Review
원래는 코딩할 때 항상 종이에 어떻게 코드를 짜면 좋을지 적어놓고 하는데 오늘은 피곤해서 그냥 생각나는대로 짰더니 코드 보는 사람들이 이해하기 힘들 것 같아서 열심히 주석 달았다...!
'<>' 안에 있는 문자열과 그렇지 않은 문자열을 나눠서 생각하면 쉽게 풀 수 있을 것 같다.