처음에 if문이 3중 이상으로 복잡해 지길래 ' '를 처리하는 경우와 <>를 추가하는 경우로 나누어서 먼저 작업하고 합쳤다.
package src.baekjoon;
import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
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 line = br.readLine();
Stack<Character> stack = new Stack<>();
for(int i = 0; i < line.length(); i++) {
if(line.charAt(i) != ' ') {
stack.push(line.charAt(i));
} else {
while(stack.size() > 0) {
bw.append(stack.pop());
}
bw.append(line.charAt(i)); // 마지막에 ' '
}
}
if(!stack.isEmpty()) {
while(stack.size() > 0) {
bw.append(stack.pop());
}
}
bw.flush();
bw.close();
}
}
package src.baekjoon;
import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
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 line = br.readLine();
Stack<Character> stack = new Stack<>();
Queue<Character> queue = new LinkedList<>();
boolean flag = false;
for (int i = 0; i < line.length(); i++) {
char ch = line.charAt(i);
if (ch == '<') { //태그 열기 시작한 경우
flag = true; //<시작
if (!stack.isEmpty()) { //닫는 <태그
while (stack.size() > 0) {
bw.append(stack.pop());
}
}
bw.append(ch);
} else if (ch == '>') {
flag = false;
if (!queue.isEmpty()) {
while (queue.size() > 0) {
bw.append(queue.poll());
}
}
bw.append(ch);
} else {
if (flag) queue.add(ch);
else { //simple text
if (ch == ' ') {
while(stack.size() > 0) {
bw.append(stack.pop());
}
bw.append(ch);
} else {
stack.push(line.charAt(i));
}
}
}
}
if(!stack.isEmpty()) {
while(stack.size() > 0) {
bw.append(stack.pop());
}
}
bw.flush();
bw.close();
}
}
<>태그의 경우 순서를 유지해야 하므로 queue에 추가하고 그냥 문자의 경우 띄어쓰기를 기준으로 stack에 추가한다.
'<'의 경우 stack을 경우에 따라 비우고, '>'의 경우 queue를 경우에 따라 비워서 bw에 추가한다.
띄어쓰기를 할 때마다 스택을 비워주면 되는데 무조건 모든 뒤집기 후에 스택을 비운다고 생각했던 점이 2일 더 잡아먹었다.
4일