본문 바로가기

Algorithm/Baekjoon

[Baekjoon] 백준 17413번: 단어 뒤집기 2 (JAVA)

728x90

문제 17413

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

[ 문제 풀이 ]

'<>' 안에 있는 문자열은 그대로 두고, '<>' 밖에 있는 문자열들만 뒤집어서 출력해야 하는 문제입니다. 일단 문자열을 뒤집어서 출력하기 위해서는 FILO(First In Last Out) 성격인 Stack<>을 이용해야 합니다. 그러면 '<>' 은 어떻게 해야 할까요?

일단 '<>' 는 쌍을 이루기 때문에 '>' 만 신경 써주면 됩니다. 문자열을 순회하면서 '>' 문자를 만났을 때, flag를 false로 바꾸어, 현재 '<' 문자가 없음을 표시해준 후, '>' 문자를 출력하면 됩니다.

여기서 flag는 '<' 를 이전에 만난 적 있는지 표시해주는 변수입니다. flag를 두면 현재의 문자가 '<>' 안에 있는지 확인할 수 있습니다.


1. flag = true 인 경우, 현재 문자가 '>' 이 나올 때까지는 '<>' 안에 있는 문자임.
2. flag = false 인 경우, 현재 문자는 '<>' 밖에 있는 문자임.

공백 기준으로 문자열을 뒤집기 때문에 문자가 빈칸인 경우에는 스택에 있는 문자들을 모두 pop()하여 출력합니다. 그 이외의 문자인 경우, 현재 flag 상태에 따라 '<>' 안에 있는 문자이면 그대로 출력하고, 밖에 있는 문자이면 Stack<>에 넣어줍니다.

모든 문자들을 순회한 후, Stack<>에 남아있는 문자들을 최종적으로 모두 pop() 해줍니다. 중복되는 코드를 방지하기 위해 Stack<>에 있는 문자들을 모두 pop() 하는 pullOut() 함수를 만들어 구현하였습니다.

[ 코드 ]

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

public class Main {
    private static Stack<Character> stack = new Stack<>();
    private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        int str_len = str.length();

        boolean flag = false; // '<' 만났는지

        for (int i = 0; i < str_len; i++) {
            char c = str.charAt(i);
            if (c == '>') {
                flag = false; // 원래대로
                bw.write(">");
            } else if (c == '<') {
                flag = true;
                if (!stack.isEmpty()) pullOut();
                bw.write("<");
            } else if (c == ' ') { // 공백 기준으로 뒤집음
                pullOut();
                bw.write(" ");
            } else {
                if (flag) { // <> 안에 있는 문자열
                    bw.write(String.valueOf(c));
                } else {
                    stack.push(c);
                }
            }
        }
        if (!stack.isEmpty()) pullOut();

        bw.flush();
    }

    private static void pullOut() throws IOException{
        while (!stack.isEmpty()) {
            bw.write(stack.pop());
        }
    }
}
728x90