

1) 스택과 큐를 함께 사용했다.
2) 태그 뒤집으면 안되기 때문에 큐에 넣어서 >가 나올때까지 poll()해줬다.
3) 태그가 아니면 공백이 아닐 때만 스택에 집어 넣었고 " "를 만나면 스택이 빌 때까지 pop()해줬다.
공백도 같이 집어 넣으면 스택에서 꺼낼 때 공백이 먼저 나오는 문제가 발생한다 (ex: "push ddd" -> "(공백)hush ddd")
4) 스택에서 pop해준다음 " "를 한번 더 push해주고 pop해줬다.
5) '<'를 만나면 스택이 비어있지 않다면 스택을 먼저 모두 pop해준 다음 큐에 데이터를 집어 넣고 꺼냈다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;
//스택과 큐를 함께 사용함
//17413번 단어 뒤집기2
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String s = br.readLine();
char[] sarr = s.toCharArray();
Stack<String> stack1 = new Stack<>();
Queue<String> queue = new LinkedList<>();
for(int i = 0; i < sarr.length; i++){
if(!String.valueOf(sarr[i]).equals(" ")){
//공백이 아닐때만 push해라
if(String.valueOf(sarr[i]).equals("<")){
//스택에 값이 있으면 먼저 pop해라
if(!stack1.isEmpty()){
while(!stack1.isEmpty()){
sb.append(stack1.pop());
}
}
//'<'를 만나면,,,>를 만날때까지 queue에 넣기
while(sarr[i] != '>'){
queue.offer(String.valueOf(sarr[i]));
i++;
}
queue.offer(String.valueOf(sarr[i]));
while(!queue.isEmpty()){
sb.append(queue.poll());
}
}else{
stack1.push(String.valueOf(sarr[i]));
}
}
if(String.valueOf(sarr[i]).equals(" ")){
while(!stack1.isEmpty()){
sb.append(stack1.pop());
}
stack1.push(" ");
sb.append(stack1.pop());
}else if(i == sarr.length -1){
while(!stack1.isEmpty()){
sb.append(stack1.pop());
}
}
}
System.out.println(sb);
}
}
조건들이 많아서 복잡하긴했지만
콘솔에 계속 찍어보고, 디버깅해서 풀이 완료!
나는 스택과 큐를 모두 사용했지만 다 풀고 나서 다른 사람들이 어떻게 풀었나 봤는데
s.charAt(i)를 활용해서 태그는 그냥 바로 sb.append()해준 것 같았다.
문자열 처리에 관한 라이브러리들에 대해 공부를 해야겠다는 생각을 하게되었다.