# BOJ17413 단어 뒤집기 2

https://www.acmicpc.net/problem/17413 (opens new window)

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으로고 한다.

먼저, 문자열 S는 아래와 같은 규칙을 지킨다.

  1. 알파벳 소문자 ('a' - 'z'), 숫자 ('0' - '9'), 공백 (' '), 특수 문자('<', '>')로만 이루어져 있다.
  2. 문자열의 시작과 끝은 공백이 아니다.
  3. '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.

태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.

# 단어를 뒤집는 순간

단어를 뒤집어서 출력하기 위해 사용한 자료구조는 Stack이다. Stack은 LIFO 구조로 가장 마지막에 들어온 데이터를 가장 먼저 확인할 수 있다.

단어를 뒤집는 순간은 두 가지이다. 태그를 시작할 때 혹은 공백으로 시작될 때 이다. 이것을 기준으로 뒤집는 기준을 설정한다.

if (flag || c == ' ') {
    while (!stack.isEmpty()) {
        System.out.print(stack.pop());
    }
    System.out.print(c);
} else {
    stack.push(c);
}

flag는 태그의 시작 유무를 나타낸다. 태그 내부의 문자는 뒤집어 출려하지 않기 때문에 그대로 출력을 진행한다. 반복문을 활용한 이유는 최초에 태그를 여는 시점에 이전 까지 저장한 데이터들을 뒤집어 출력해야 하기 때문에 추가하였다. 태그가 시작한 뒤로는 Stack에 저장되지 않고 반복문 아래 출력문을 통해 순서 그대로 출력되는 것을 보장한다.

# 제출 코드

아래는 최종 제출 코드이다.

public class BOJ17413 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        String word = scanner.nextLine();

        Stack<Character> stack = new Stack<>();

        boolean flag = false;
        for (char c : word.toCharArray()) {
            if (c == '<') {
                flag = true;
            }

            if (flag || c == ' ') {
                while (!stack.isEmpty()) {
                    System.out.print(stack.pop());
                }
                System.out.print(c);
            } else {
                stack.push(c);
            }

            if (c == '>') {
                flag = false;
            }
        }

        while (!stack.isEmpty()) {
            System.out.print(stack.pop());
        }
    }
}
#BOJ #구현 #문자열
last updated: 12/26/2021, 1:04:25 PM