[17413]単語反転2


🔗 質問リンク


https://www.acmicpc.net/problem/17413

問題の説明


文字列Sが与えられると、その文字列の中で単語だけを反転させたい.
まず、文字列Sは、以下のルールを遵守する.

  • 小文字("a"-"z")、数字("0"-"9")、スペース(")、特殊文字("<"、">")のみで構成されます.

  • 文字列の先頭と末尾はスペースではありません.

  • 「<」と「>」は文字列内で交互に現れ、「<」が先に現れる.また、2文字の個数は同じです.
  • ラベルは「<」で始まり、「>」で終わる長さが3より大きい部分文字列で、「<」と「>」の間にはアルファベット小文字とスペースしかありません.単語は小文字と数字からなる部分文字列で、連続する2つの単語は1つのスペースで区切られています.ラベルは単語ではなく、ラベルと単語の間にスペースがありません.
    1行目に文字列Sの単語を逆さに出力します.

    ⚠▼制限


  • 最初の行は文字列Sを与える.

  • Sの長さは100000以下である.
  • 💡 プール(言語:Java)


    反転出力は、入る逆の順序で出力されるLIFOである.つまり,スタックを利用して実現すればよい.
    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            char[] input = br.readLine().toCharArray();
            StringBuilder answer = new StringBuilder();
            Stack<Character> stack = new Stack<>();
            // 태그 안인지 알려주는 변수
            boolean flag = false;
    
            for (char ch : input) {
                // 태그 시작
                if (ch == '<') {
                    // 앞에 글자들 아직 뒤집어서 정답에 반영 안했으면 처리
                    while (!stack.isEmpty())
                        answer.append(stack.pop());
                    answer.append('<');
                    flag = true;
                // 태그 종료
                } else if (ch == '>') {
                    answer.append('>');
                    flag = false;
                // 태그 안의 내용은 그대로 넣기
                } else if (flag) {
                    answer.append(ch);
                // 태그 밖일 때, 공백 만났을 경우
                } else if (ch == ' ') {
                    // 공백 직전까지 글자를 뒤집어서 넣어줌 = 스택에서 pop()
                    while (!stack.isEmpty())
                        answer.append(stack.pop());
                    answer.append(' ');
                // 태그 밖에서 공백아닌 글자들은 전부 스택에 넣어줌
                } else {
                    stack.push(ch);
                }
            }
            // for문을 다돌았을때 아직 처리안된 stack의 글자들을 뒤집어서 넣기
            while (!stack.isEmpty())
                answer.append(stack.pop());
            System.out.print(answer);
        }
    }