https://www.acmicpc.net/problem/17413
(정답률 56.872%)
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.
baekjoon online judge
noojkeab enilno egduj
import java.io.*;
import java.util.*;
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 = br.readLine();
List<Character> result = new ArrayList<>();
Stack<Character> stack = new Stack<>();
boolean isTag = false; //태그인지 판단하는 불리언 변수
//입력받은 문자열 문자 하나씩 체크한다
for (char c : str.toCharArray()) {
//'<'를 만나면 태그로 판단
//스택에 데이터가 있을 경우 모두 꺼낸다
if (c == '<') {
isTag = true;
while (!stack.isEmpty()) {
result.add(stack.pop());
}
//'>'를 만나면 태그가 아닌걸로 판단
} else if (c == '>') {
isTag = false;
result.add(c);
continue;
//공백을 만났을때 태그가 아닌 경우
//스택에 데이터가 있을 경우 모두 꺼낸다
} else if (c == ' ' && !isTag) {
while (!stack.isEmpty()) {
result.add(stack.pop());
}
}
//태그이거나 단어를 구분하는 공백일 경우
//그래도 리스트에 추가한다
if (isTag || c == ' ') {
result.add(c);
//태그가 아닐 경우 스택에 넣는다.
} else if (!isTag) {
stack.add(c);
}
}
//스택에 데이터가 남아 있을 경우 모두 꺼낸다
while (!stack.isEmpty()) {
result.add(stack.pop());
}
for (char c : result) {
bw.write(c);
}
bw.close();
}
}