본문 바로가기
Study (etc)/Problem Solving

[BOJ / C++] 9093번 : 단어 뒤집기

by Haren 2023. 3. 10.

문제

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

입력

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

출력

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

Solved.ac 레벨

브론즈 I

풀이

#include <bits/stdc++.h>

using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int t;
    cin >> t;
    cin.ignore();

    while(t--){
        string input;
        stack<char> st;

        getline(cin, input);
        input += ' ';

        for(int i = 0; i < input.length(); i++){
            if(input[i] == ' '){
                while(!st.empty()){
                    cout << st.top();
                    st.pop();
                } 
                cout << input[i]; //공백 출력
            } else {
                st.push(input[i]);
            }
        }
    }
    
    return 0;
}

공백을 포함한 문자열을 받기 위해서는 getline()을 활용해주어야 하며, ignore()로 버퍼 내에 남아있는 개행문자를 지워준다.

문자열을 뒤집는 것은 가장 먼저 들어간 요소가 맨 마지막으로 나오는 자료구조 (FILO : First In Last Out)인 스택을 활용하였다.

 

문자열의 길이만큼 반복하며 다음과 같은 과정을 반복한다.

 

1. input의 i번째가 공백인 경우

단어가 끝났다고 판단하여 스택이 빌 때까지 스택에서 요소를 꺼내며 출력한다.

스택이 비면 공백 하나를 출력하여 원문과 동일한 구조를 유지한다.

 

2. input의 i번째가 공백이 아닌 경우

스택에 단어의 알파벳을 하나씩 집어넣는다.

 

 

9093번: 단어 뒤집기

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

www.acmicpc.net