문제


입력 및 출력


풀이

// 이전 단어뒤집기 문제의 경우, 공백을 기준으로 단어를 나누었다.
// 이번 문제의 경우 꺽새 내부는 동일하게 처리하되, 꺽새가 아닌 경우 단어를 뒤집어주어야한다.
import java.io.*;
import java.util.*;

class Main {
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 문자열 S입력
        String str = br.readLine();

        // 결과 값을 출력할 StringBuilder
        StringBuilder sb = new StringBuilder();

        // 열린 꺽새와 닫힌 꺽새를 판별하기 위한 flag
        boolean flag = false;

        // 후입선출 기능을 이용하기 위한 자료구조 Stack
        Stack < Character > stack = new Stack < > ();

        // 문자열 S의 길이만큼 반복문 수행
        for (int i = 0; i < str.length(); i++) {
            // 열린 꺽새를 만났을 경우, stack이 비어있지 않다면 모든 원소를 꺼내고 flag를 true
            if (str.charAt(i) == '<') {
                while (!stack.isEmpty()) {
                    sb.append(stack.pop());
                }
                flag = true;
            }
            // 닫힌 꺽새를 만났을 경우, flag를 false로 입력 후 '>'저장
            else if (str.charAt(i) == '>') {
                flag = false;
                sb.append(str.charAt(i));
                continue;
            }

            // flag가 true일 경우, '>'를 만나기 전까지 그대로 입력
            if (flag == true) {
                sb.append(str.charAt(i));
            }
            // flag가 false일 경우, 괄호 이외의 문자를 처리
            else if (flag == false) {
                // 해당 인덱스의 i번째 문자가 공백일 경우, 모든 원소를 POP수행 후 공백 추가
                if (str.charAt(i) == ' ') {
                    while (!stack.isEmpty()) {
                        sb.append(stack.pop());
                    }
                    sb.append(' ');
                    continue;
                } else {
                    // 그외의 경우, Stack에 문자 추가
                    stack.push(str.charAt(i));
                }
            }

            // 반복문이 마지막 횟수일 때, 스택이 비어있지 않다면 원소 추가
            if (i == str.length() - 1) {
                while (!stack.isEmpty()) {
                    sb.append(stack.pop());
                }
            }
        }

        // 결과문 출력
        System.out.println(sb);
    }
}

결과 및 해결방법

[결과]

[정리]

해결방법

  • 이전 단어뒤집기 문제의 경우, 공백을 기준으로 단어를 나누어 반복문의 조건식을 이용하여 출력하였다.

    하지만 이번 단어뒤집기2의 경우, 꺽새의 내부 문자열은 그대로 유지하고 꺽새의 외부 문자열을 뒤집어야했다.

  • 먼저 열린 꺽새와 닫힌 꺽새를 만났다는 것을 판별하기 위해 flag변수를 설정하였다. 이 변수는 '<'기호를 만났을 때 true의 값이 되고, '>'기호를 만났을 때 false값으로 설정된다.

    내가 여기서 문제를 해결할 때 사용한 자료구조는 스택으로써, 후입선출(LIFO)의 특징을 갖고있다. 따라서 [A, B, C]순으로 스택에 들어갔다면 [C, B, A]순으로 스택에서 나올 것이다.

  • 가장 먼저 입력받은 문자열 S의 길이만큼 반복문을 수행한다.

    만약, 해당 문자가 '<'일 경우, 스택이 비어있지 않다면 모든 원소를 꺼내고 flagtrue값으로 설정한다. 해당 문자가 '>'일 경우 flagfalse값으로 설정하고, 닫힌 기호를 StringBuilder에 추가한다.

    flagtrue일 경우, 해당 문자를 StringBuilder에 그대로 추가해주고, flagfalse일 경우, 인덱스의 위치에 해당하는 문자가 공백일 경우 스택에 있는 모든 원소를 StringBuilder에 추가하고, 공백 문자도 추가한다.

    그 외의 경우, 스택에 인덱스 위치에 해당하는 문자를 넣는다.

    반복문이 마지막 횟수일 때, 스택이 비어있지 않는다면 StringBuilder에 원소를 추가한다.

profile
"계획에 따르기보다 변화에 대응하기를"

0개의 댓글