- <> 처리
- 공백으로 문자 간 구분
- <> 내부 문자가 아니라면 모두 뒤집는다.
<를 만나면,
이전까지 stack에 집어넣었던 모든 문자를 배출합니다.(트리거 역할) 그리고 마킹(boolean 활용)을 하고 다음 문자부터는 모두 그대로 집어넣습니다.
>를 만나면,
앞에서 마킹했던 boolean을 false로 바꾸고 다시 문자 받을 준비를 합니다.
문자열 뒤집기는 stack을 활용하여 쉽게 해결하였고, ' '를 통해 문자 간 구분을 하므로 stack pop의 트리거 역할은 ' '가 하도록 하였습니다.
예를 들어, RJHRJH JHRJHRJHR 문자열이 입력으로 들어 왔다면 RHJRHJ를 스택에 넣고 ' '를 만나는 순간 stack의 모든 원소를 뱉도록 하였습니다.
물론 tag 안에 ' '가 있을 경우에는 stack 연산을 실행하면 안 됩니다.
JHRJHRJHR 또한 출력되어야 하는데, 이 경우 ' ' 없기 때문에
모든 처리 코드가 끝난 후, 마지막에 스택의 내용물을 전부 꺼내는 작업을 실시합니다
public static void main(String[] args) throws IOException {
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
char[] input = bfr.readLine().toCharArray();
Stack<Character> stack = new Stack<>();
StringBuilder result = new StringBuilder();
boolean tagOpen = false;
for (char c : input) {
if (c == '<') {
while (!stack.isEmpty())
result.append(stack.pop());
tagOpen = true;
result.append(c);
} else if (tagOpen && c == '>') {
result.append(c);
tagOpen = false;
} else if (!tagOpen && c == ' ') {
while (!stack.isEmpty())
result.append(stack.pop());
result.append(c);
} else {
if (tagOpen)
result.append(c);
else
stack.add(c);
}
}
while (!stack.isEmpty())
result.append(stack.pop());
bfw.write(result.toString());
bfw.flush();
bfw.close();
bfr.close();
}