[백준/BOJ] 9093번_단어 뒤집기 (C++/Java)

JIMIN·2023년 2월 5일

BOJ_Bronze

목록 보기
68/75

https://www.acmicpc.net/problem/9093

문제


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


입력


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


출력


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



💻 예제 입력

2
I am happy today
We want to win the first prize

💻 예제 출력

I ma yppah yadot
eW tnaw ot niw eht tsrif ezirp

풀이


단어를 뒤집어서 출력해야 하므로 Last In, First Out (LIFO) 후입선출 방식을 사용하기 위해 stack을 이용함.

→ 만약 hello 라는 단어가 스택에 차례대로 들어가면, 나올때는 뒤에서부터 나오기 때문에 olleh가 되어 단어가 뒤집어짐.

공백을 포함한 문장을 받아온 후, 한글자씩 검사하면서 공백이 아닐 경우 스택에 push하고 공백이 나오면 스택에 있는 모든 값들을 차례대로 꺼냄.


C++의 경우 공백 포함 문자열을 받아오기 위해 getline() 을 사용한다.

getline은 입력 버퍼에서 값을 읽어오는데, 테스트 케이스 T를 입력 받을 때 T에는 개행 문자 ‘\n’이 들어가지 않고 입력 버퍼에 남아있게 됨. 따라서 getline이 남아 있는 ‘\n’을 읽게되므로 이를 비워주는 것이 cin.ignore();


Java의 경우 System.out.print를 사용했을 때 시간초과가 발생하여 BufferedWrite 객체를 활용함.

C++에서는 문자열 마지막에 공백을 붙여 단어를 확인하는 용도로 사용했지만, Java에서는 String 객체에 다른 문자열을 연결했을 때 새로운 String 객체로 만들어지기 때문에 비효율적이다.

→ 따라서 반복문을 돌때 i값이 문자열 끝에 도달했는지 추가적으로 확인함.


C++ 소스코드


#include <iostream>
#include <stack>
using namespace std;

int main(void)
{
    int T;s
    cin >> T;
    cin.ignore();       // 입력 버퍼 비우기 (T 입력 후 남은 '\n' 제거)
    stack <char> word;  // 스택 생성
    
    while (T--)
    {
        string str;
        getline(cin, str);  // 한 줄 읽어오기
        str += ' ';         // 마지막에 공백 추가 (마지막 단어 확인용)
        
        for (int i = 0; i < str.length(); i++) {
            if (str[i] == ' ')  // 공백이면?
            {
                // 스택에 push 해놓은 단어들 꺼내오기
                while (!word.empty()) {
                    cout << word.top();
                    word.pop();
                }
                cout << ' ';      // 공백 출력 (띄어쓰기)
            }
            else word.push(str[i]);  // 공백 아닐 경우엔 스택에 push
        }
        cout << "\n";
    }
}

Java 소스코드


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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int T = Integer.parseInt(br.readLine()); // 테스트 케이스
        Stack<Character> word = new Stack<>(); // 스택 생성

        while (T-- != 0)
        {
            String str = br.readLine();

            for (int i = 0; i <= str.length(); i++) {
                // 공백이거나 마지막 문자이면?
                if (i == str.length() || str.charAt(i) == ' ')
                {
                    // 스택에 push 해놓은 단어들 꺼내오기
                    while (!word.empty()) {
                        bw.write(word.pop());
                    }
                    bw.write(' ');    // 공백 출력 (띄어쓰기)
                }
                else word.push(str.charAt(i));  // 공백 아닐 경우엔 스택에 push
            }
            bw.write("\n");
            bw.flush();
        }
        bw.close();
    }
}
profile
잘못된 코드나 정보가 있다면 알려주세요! 👋🏻

0개의 댓글