문제 출처: https://www.acmicpc.net/problem/17413
문제
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder(reader.readLine()).append(" ");
String pattern = "[a-z0-9]+";
int left = 0;
boolean flag = true; // 연달아 구분자가 나오는 처리(true -> 정상진행, false -> 구분자 처리)
boolean isContinue = false; // <> 처리(true -> 생략해야되는 문자)
// 연달아 나온다면? <> 처리...
for (int i = 0; i < sb.length(); i++) {
if (!isContinue) { // 생략해야되는 부분이 아닌 경우
if (!sb.substring(i, i + 1).matches(pattern)) { // 패턴과 매치되지 않는 경우 -> 구분자인 경우
if (sb.substring(i, i + 1).equals("<")) { // "<" 모양인지 확인
isContinue = true; // 맞을 경우 뒤에 나오는 것들을 생략해야하므로 true로 변경
}
if (flag) { // 처음나오는 구분자인 경우(정상처리면 true이므로)
StringBuilder temp = new StringBuilder(sb.substring(left, i)); // 구분자 전까지의 내용
sb.replace(left, i, temp.reverse().toString()); // 뒤집기
flag = false; // 구분자를 처리하였으므로 false
left = i + 1; // left index 이동
} else { // 연달아 나오는 구분자인 경우
left = i + 1; // left index만 옮기고 끝
continue;
}
} else { // 패턴과 일치하는 경우
flag = true; // flag를 true로 둠
continue;
}
} else if (sb.substring(i, i + 1).equals(">")) { // 생략해야되는 부분 진행 중 ">"를 만난 경우
left = i + 1; // left index 옮기고
isContinue = false; // 생략 그만
} else { // 생략해야되는 부분인 경우
continue;
}
}
System.out.println(sb);
}
}