백준 | 9093번. 단어 뒤집기 문제 풀이

728x90

9093번. 단어 뒤집기

문제

문장이 주어졌을 때, 단어를 모두 뒤집어서 출력하는 프로그램을 작성하시오. 단, 단어의 순서는 바꿀 수 없다. 단어는 영어 알파벳으로만 이루어져 있다.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는 공백이 하나 있다.

출력

각 테스트 케이스에 대해서, 입력으로 주어진 문장의 단어를 모두 뒤집어 출력한다.

첫 시도 코드

  • 콘솔 출력 답은 맞았는데, 메모리 초과가 떴다.
  • 메모리 커질수록 시간은 줄고, 시간이 늘어날수록 메모리는 적어진다.
  • 다시 풀자.
package to_0502;

import java.util.*;
/* 9093번. 단어 뒤집기 - 스택 사용 -(1) 답은 맞았는데. 메모리 초과 ㅠ
 * */
public class Main {
    //솔루션 함수 
    public String solution(String str) {
        String answer= "";
        Stack<Character> st = new Stack<>(); 

        for(String x : str.split(" ")) {

            char[] tmp = x.toCharArray();

            for(int i=0; i<tmp.length; i++) {
                st.push(tmp[i]);
            }

            while(!st.isEmpty()) {
                answer += st.pop();
            }        
            answer += " ";
        }

        return answer;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Main T = new Main();
        Scanner kb = new Scanner(System.in);

        int tc = Integer.parseInt(kb.nextLine());
        String[] tmp = new String[tc];

        for(int i=0; i<tc; i++) {
            tmp[i] = kb.nextLine();
        }

        for(int i=0; i<tc; i++) {
            System.out.println(T.solution(tmp[i]));
        }
    }

}

완성 코드

  • 모두 main에서 코드를 짰고, BufferedReader와 Writer 로 입출력을 대체했다.
  • 1) 각 입력받은 문장 맨 뒤에는 끝을 알리는 \n개행 문자를 추가한 뒤
  • 2) 각 문자가 공백 or 개행문자인 경우 pop() 하고, 아닌 경우 push()
import java.io.*;
import java.util.*;

public class Main {
    //입출력 변수 
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    //실행 메인 
    public static void main(String[] args) throws IOException{

        int t = Integer.parseInt(br.readLine());

        while(t--> 0) {
            Stack<Character> st = new Stack<>();
            //끝을 알리는 \n개행 문자 담고 
            String str = br.readLine() + "\n";
            for(char x : str.toCharArray()) {
                if(x == ' ' || x =='\n') {
                    while(!st.isEmpty()) {
                        bw.write(st.pop());
                    }
                    bw.write(x);;
                }else st.push(x);
            }
        }

        bw.flush();
    }
}

728x90