단어 뒤집기 2

구해야 하는 것

  • 주어진 문자열에서 단어만 뒤집어라

주어진 자료

  • 문자열 s는 알파벳 소문자, 숫자, 공백, '<', '>'로만 이루어져 있음
  • 문자열의 시작과 끝은 공백이 아님
  • '<', '>'로 감싸진 단어는 태그이며, 이는 단어로 간주하지 않음

조건

  • 문자열 s의 길이 <= 100,000

계획

  1. 공백을 만나기 전까지 문자열 s를 돌면서 스택에 쌓는다.
  2. 공백을 만나면 스택의 맨 위부터 꺼내서 출력한다.
  3. '<'를 만나면 '>'를 만날 때까지 스택에 쌓지 않고 그대로 출력한다.

실행

public class Main {
    // 스택 출력
    public void printStack(Stack<Character> stack) {
        while(!stack.isEmpty()) {
            System.out.print(stack.pop());
        }
    }
    
    public void solution() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();

        Stack<Character> stack = new Stack<>();
        
        for(int i = 0; i < input.length(); i++) {
            char cur = input.charAt(i);
            
            if(cur == '<') { // '<'를 만나면
                printStack(stack); // 혹시 스택에 쌓인게 있으면 출력
                
                while(cur != '>') { // '>'를 만날 때까지 뒤집지 않고 출력
                    cur = input.charAt(i);
                    System.out.print(cur);
                    
                    if(cur == '>') {
                        break;
                    }
                    i++;
                }
            } else if (cur == ' ') { // 공백을 만나면
                printStack(stack); // 스택 출력
                System.out.print(" ");
            } else {
                stack.push(cur); // 공백 만날때까지 스택에 쌓음
            }
        }
        printStack(stack); // 문자열 끝까지 다 돌았으면 스택 출력
    }
    
    public static void main(String[] args) throws IOException {
        new Main().solution();
    }
}