본문 바로가기
알고리즘/백준

백준 17413번 - 단어 뒤집기 2(Java 8)

by latissimus 2022. 3. 11.

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

 

17413번: 단어 뒤집기 2

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져

www.acmicpc.net

Stack 사용

import java.io.*;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
    static Stack<Character> stack = new Stack<>();
    static Stack<Character> tagChecker = new Stack<>();

    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 input = br.readLine();

        char[] inputArr = input.toCharArray();

        for (int i = 0; i < inputArr.length; i++) {

            //태그
            if(isTag()){
                //바로 쓰기
                bw.write(inputArr[i]);

                //'>'인 경우 pop해서 태그아님 상태 만들기 '>'은 위에서 이미 write함
                if (inputArr[i] == '>' && isTag()) {
                    tagChecker.pop();
                }

            //아닐 때
            } else if (!isTag()) {

                //'<'만나면 tagChecker에 push하고, stack 다 뱉고, '<'쓰기
                if (inputArr[i] == '<') {
                    tagChecker.push('<');
                    while (!stack.isEmpty()) {
                        bw.write(stack.pop());
                    }
                    bw.write('<');
                    continue;
                }
                //공백이면 stack 다 뱉고, 공백 쓰기
                if (inputArr[i] == ' ') {
                    while (!stack.isEmpty()) {
                        bw.write(stack.pop());
                    }
                    bw.write(inputArr[i]);
                }
                //공백이 아니면 스택에 (뒤집어야하니까)넣기
                if (inputArr[i] != ' ') {
                    stack.push(inputArr[i]);
                }
            }
        }
        while (!stack.isEmpty()) {
            bw.write(stack.pop());
        }
        bw.flush();
        bw.close();
    }
        public static boolean isTag() {
            return !tagChecker.isEmpty(); //tagChecker에 값이 남았을 때 == '<,>' 안에 있을 때
        }
}

*stack을 하나만 쓰고 flag를 쓰는게 더 나은지 모르겠다.

'알고리즘 > 백준' 카테고리의 다른 글

백준 17298번 - 오큰수 (Java 8)  (0) 2022.03.12
백준 10799번 - 쇠막대 (Java 8)  (0) 2022.03.12
백준 1406번 - 에디터 (Java 8)  (0) 2022.03.11
백준 10866번 - 덱 (Java 8)  (0) 2022.03.11
백준 10845번 - 큐 (Java 8)  (0) 2022.03.10

댓글