ALGORITHM

[JAVA] 백준 17413번- 단어 뒤집기2

연듀 2022. 7. 21. 16:30

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

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

 

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

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        Stack<Character> stack = new Stack<>();

        boolean isTag = false;

        for(char x : str.toCharArray()){
            if(x == '<'){
                isTag = true;
                while(!stack.isEmpty()){
                    System.out.print(stack.pop()); // 스택 값들 모두 pop하여 출력
                }
                System.out.print(x); // '<' 출력
            }
            else if(x=='>'){
                isTag=false;
                System.out.print(x);
            }
            else if(!isTag){ // 태그 바깥의 값이라면
                if(x == ' '){ // 공백을 만나면
                    while(!stack.isEmpty()) System.out.print(stack.pop()); // 스택 값들 모두 pop하여 출력
                    System.out.print(x); // 공백까지 출력
                }
                else stack.push(x); // 스택에 push
            }
            else if(isTag) System.out.print(x); // 태그 안의 값 그대로 출력
        }
        while(!stack.isEmpty()){ // 끝에 공백이 없는 마지막 문자열 pop해 출력
            System.out.print(stack.pop());
        }


    }
}

 

 

괄호 '<' 를 만나면 isTag 변수를 true로 한다. 그리고 스택에 있던 값들을 모두 pop하여 출력한다. 

isTag 변수가 true라면(태그 안의 값이라면) 스택에 푸시없이 그대로 출력한다.

괄호 '>'를 만나면 isTag 변수를 false로 하고, '>'를 출력한다.

태그 바깥의 값이라면 스택에 푸시하고, 공백을 만나면 스택에 있는 값들을 pop하여 출력한다.

이 때 태그 바깥의 값인 문자열 중 마지막 문자열일 경우 문자열 끝에 공백이 없으므로 스택에 남아있게 된다.

그래서 마지막에 스택에 있는 값들을 모두 pop하여 출력해주는 코드를 추가한다.