백준 알고리즘

5. 9093번 단어 뒤집기 ( java )

Romenest 2021. 9. 2. 11:33

 

package com.example;

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

public class training3 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int a = Integer.parseInt(br.readLine());


        while(a>0){
            Stack<Character> stack = new Stack<>();
            String string = br.readLine();
            
            for(int i=0; i<string.length(); i++){
                char c = string.charAt(i);

                if(c == ' '){ //i번째가 공백일 경우 아래 반복문 실행     
                    while(!stack.empty()){ //만약 스택에 정보가 있을경우 최상위 pop  ---- 2번
                        System.out.print(stack.pop()); //각 반복문,조건문안의 print는 줄바꿈 x
                    }
                    System.out.print(" "); //스택에 정보없을 경우 " " 공백 출력
                }
                else{  //i번째가 공백이 아닐경우
                    stack.add(c); 스택에 c(문자열) 의 i번째를 저장     -----1번
                }

            }
            while (!stack.empty()) {  // 위 반복문 실행후 스택이 비어있지 않다면
                System.out.print(stack.pop()); // 최상위에있는 스택 출력
            }
            System.out.println(" "); //마지막은 결과물이 출력후 줄바꿈 o 

            a--; // 명령수 -1
        }
        
    }
}

if문은 사실상 1번 - > 2번 순으로 작동됨

 

 

 

 

예를 들어 

abcd □ abcd □ abcd일경우 첫번째 if문 while문에서는 공백을 만났을때 중간의 빈곳 두곳을 판별

i번째 글자가 □ (공백) 이다 . 그렇다면 조건을 한번더 걸어서

스택에 정보가 쌓여있을때만 스택의 정보를 pop 그리고 □ 출력

이유는 abcd 이후 □ 를 출력해주지않는다면 

결국 다시 실행했을때 abcdabcd 와같이 붙어서 나오기 때문

 

이후 for반복문 이 끝나고

줄바꿈을 위해 println을 사용하기 위한 새로운 while문 작성

이후 a--로 초기 선언한 명령인 a의 수를 감소

 

 

결과