학습용 공간

알고리즘/백준 알고리즘(JAVA) 2020.07.16 댓글 개 starmk95

JAVA)17413번 단어뒤집기2 - 스택(Stack) 사용

입력받은 문자열에서 태그가 맞으면 그대로 출력하고 태그가 아니라면 스택을 사용해서 단어를 뒤집어서 출력한다.

태그 판별은 '<'를 입력으로 받으면 시작, '>'를 입력으로 받으면 끝으로 구분했다. 

태그가 아닌 단어가 들어오면 이를 스택에 차례로 push하고 해당 단어가 끝나면 stack에 쌓인 문자들을 모두 pop해서 출력해주면 뒤집힌 단어로 출력된다.

stack의 모든 단어들을 pop해야하는 조건은 3가지이다.

 1. 태그가 시작될 때 ('<'가 입력으로 들어옴)

 2. 태그의 일부가 아닌 공백이 입력으로 들어올 때 (단어들은 공백으로 구분됨)

 3. 입력받은 문자열의 마지막 문자의 입력이 끝났을 때

 

입출력의 시간 소요를 줄이기 위해 BufferedReader와 StringBuilder를 사용하였다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Stack<Character> stack = new Stack<>();
        StringBuilder sb = new StringBuilder();
        String sentence = br.readLine();
        int tagFlag = 0;
        /* 태그이면 바로 StringBuilder로 문자열에 추가해주고,
        *  태그가 아니라면 stack에 순서대로 push 해준 뒤,
        *  태그의 시작(<) 또는 공백 또는 마지막 문자가 나올때 (조건 1, 2, 3)
        *  stack에 담신 문자들을 모두 pop 해준다. -> 뒤집힌 문자 만들어짐*/
        for (int i=0;i<sentence.length();i++) {
            if (sentence.charAt(i) == '<') { // tag 시작 - stack에 있는 문자들 모두 pop (조건 1)
                tagFlag = 1;
                while (!stack.empty()) { // stack의 문자들 모두 pop
                    sb.append(stack.pop());
                }
            }

            if (tagFlag == 0) { // tag 아닐 때
                if (sentence.charAt(i) == ' ') { // tag 아니면서 공백이 등장 (조건 2)
                    while (!stack.empty()) { // stack의 문자들 모두 pop
                        sb.append(stack.pop());
                    }
                    sb.append(' ');
                } else { // tag 아니고 공백도 아니라면
                    stack.push(sentence.charAt(i)); // stack에 문자 넣어줌
                }

            } else { // tag 맞을 때
                sb.append(sentence.charAt(i));
                if (sentence.charAt(i) == '>') { // tag 끝나면 알림
                    tagFlag = 0;
                }
            }

            if (i+1 == sentence.length()) { // 문자열의 마지막 문자인 경우 (조건 3)
                while (!stack.empty()) { // stack의 문자들 모두 pop
                    sb.append(stack.pop());
                }
            }
        }
        System.out.print(sb);
        br.close();
    }
}

 

문제 출처 : https://www.acmicpc.net/problem/17413