ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 17413번: 단어 뒤집기2
    Algorithm/백준 알고리즘 2021. 7. 7. 15:05


    문제 설명

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

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

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

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

     

    입력

    • 첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.

     

    출력

    • 첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.

     

    풀이

    1. 단어뒤집기 1문제와 똑같은 형태로 약간의 변화만 준다면 쉽게 해결할 수 있는 문제이다. 단어를 뒤집기 위해 Stack을 사용하였다. Stack은 아시다시피, 가장 늦게들어온 원소가 가장 먼저 가장 먼저 리턴되는 특징이 있다.
    2. 따라서, Stack을 사용할 경우 h, e, l, l, o 순으로 push연산을 수행할 경우 o, l, l, e, h 순으로 pop연산이 실행될 것이다.
    3. 입력받은 문자열을 str에 저장하고, check를 이용하여 '<'와 '>'기호접근을 판단한다.
    4. '<', '>', ' '을 만났을 경우 show함수를 통해 스택에 저장되어있던 모든 원소를 화면에 출력한다.
    5. 만약 꺽새 기호를 만났을 경우 그 내부에 있는 문자들은 그대로 화면에 출력한다.

     

    코드

    /*
    문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
    
    먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
    
    알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
    문자열의 시작과 끝은 공백이 아니다.
    '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.
    태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.
    */
    
    import java.util.*;
    
    class Main {  
      public static void main(String args[]) { 
        Scanner sc = new Scanner(System.in);
        Stack stack = new Stack();
    
        String str = sc.nextLine();
        boolean check = false;
    
        for(int i = 0; i < str.length(); i++){
          if(str.charAt(i) == '<'){
            show(stack);
            check = true;
            System.out.print(str.charAt(i));
          }else if(str.charAt(i) == '>'){
            check = false;
            System.out.print(str.charAt(i));
          }else if(check){
            System.out.print(str.charAt(i));
          }else{
            if(str.charAt(i) == ' '){
              show(stack);
              System.out.print(str.charAt(i));
            }else{
              stack.push(str.charAt(i));
            }
          }
        }
        show(stack);
      }
    
      static void show(Stack stack){
        while(!stack.empty()){
          System.out.print(stack.peek());
          stack.pop();
        }
      }
    }

    'Algorithm > 백준 알고리즘' 카테고리의 다른 글

    [JAVA] 17298번: 오큰수  (0) 2021.07.08
    [JAVA] 10799번: 쇠막대기  (0) 2021.07.07
    [JAVA] 1158번: 요세푸스 문제  (0) 2021.07.06
    [JAVA] 10845번: 큐  (0) 2021.07.06
    [JAVA] 1406번 : 에디터  (0) 2021.07.05

    댓글

[Everything's gonna be fine]