PS, 언어 공부/알고리즘 문제풀이

[JAVA] 백준 온라인저지 9093

Emil :) 2020. 6. 25. 20:19
728x90
반응형

문제


 

 

 

코드


Scanner대신 BufferedReader, Writer를 써봤다. 이걸로 쓰는 습관을 들이는게 좋을듯.

먼저 어떻게 풀지 생각해보면..
개행문자나 공백을 구분해서 역순으로 출력해야한다.
이 경우 스택을 쓰는게 간편하고, 일반적인 배열로도 풀 수 있지만 효율이 안좋으니 그건 패스하도록 하겠다.
(그냥 문자열 입력받고, 배열의 크기만큼 for문돌려서 뒷 인덱스부터 출력하면된다. 근데 스택이있잖아?)

암튼 전체 코드다.

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(bf.readLine());
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        while (t-- > 0) {
            String str = bf.readLine() + "\n";
            Stack<Character> s = new Stack<>();
            for (char ch : str.toCharArray()) {
                if (ch == '\n' || ch == ' ') {
                    while (!s.isEmpty()) {
                        bw.write(s.pop());
                    }
                    bw.write(ch);
                } else {
                    s.push(ch);
                }
            }
        }
        bw.flush();
    }
}

 

여기서 중요한 부분만 추려보자면..

while (t-- > 0) {
    String str = bf.readLine() + "\n";
    Stack < Character > s = new Stack < > ();
    for (char ch: str.toCharArray()) {
        if (ch == '\n' || ch == ' ') {
            while (!s.isEmpty()) {
                bw.write(s.pop());
            }
            bw.write(ch);
        } else {
            s.push(ch);
        }
    }
}
bw.flush();

line1- 입력받은 횟수만큼
line2- 새로운 문자열을 입력받는다.
line3- 스택 선언
line4- 입력받은 문자열을 배열로 변환해주고, ch가 배열크기만큼 돈다.
line5- 개행이나 공백이면
line6~ - 그리고 이 때, 스택이 비어있지 않다면 출력을 하고, 아니라면 ch, 즉 공백이나 개행을 출력한다. 
line10- 공백이 아니라면 스택에 push해주자.

그니까 쉽게말하자면, 공백이나 개행을 만날때마다 역순으로 출력해줘서 스택을 비우고, 다시 채우는거다.

 

 

결과


728x90
반응형