본문 바로가기
알고리즘 공부...공......공

[백준: 알고리즘_Java] 9093_단어 뒤집기

by MININI 2021. 12. 24.

 

<문제>

 


<풀이>

이것도 앞의 문제와 마찬가지로 BufferedReader, BufferedWriter를 사용해야 시간초과가 안뜸.

 

단어의 순서는 유지하고, 단어를 뒤집어서 출력해야 하므로

띄어쓰기를 기준으로 Stack에 넣고 출력하기로 함.

 

 

1. 일단 한 문장을 입력 받아 char 배열에 넣음

2. for each문으로 순서대로 검사.
3. 띄어쓰기가 나오기 전까지 Stack에 계속 추가하다가
4. 띄어쓰기가 나오면 Stack에 넣은 모든 문자들을 pop()해서 버퍼Writer에 쓰기.
(주의사항: 한 단어를 출력하는 것이니 모두 다 write()한 후 띄어쓰기(공백)를 추가로 write..)

5. (3~4)번 반복하다가 마지막 단어까지 Stack에 추가하고 나면, 더 이상 띄어쓰기가 나오지 않으므로
다음문장을 입력받기 전에 Stack의 문자들을 Writer에 write()해야 함.


!!bw.close() 혹은 bw.flush() 해 주어야 제대로 출력됨.

 

import java.util.*;
import java.io.*;
public class RverseWord {
    //1. 문장 입력 받기
    //2. 스택에 넣기
    //3. 스택에 넣은 거 (pop)출력
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        try {
            int n = Integer.parseInt(br.readLine()); //입력 받을 문장의 수

            for (int i = 0; i < n; i++) {
                Stack<Character> st = new Stack();
                char[] input = br.readLine().toCharArray();
                for (char c : input) {
                    if (c != ' ') {
                        st.add(c);
                    } else {
                        //공백 문자 나오면 문자 출력
                        while (!st.empty()) {
                            bw.write(st.pop());
                        }
                        bw.write(" ");
                    }
                }
                //문장의 마지막 단어 출력
                while (!st.empty()) {
                    bw.write(st.pop());
                }
                bw.write("\n");

            }
            bw.close();
            br.close();
        }catch (IOException e) {
            e.printStackTrace();
        }


    }
}

 


<결과>

처음에 Scanner와 print 사용해서 시간 초과

 

댓글