Suhwanc

문제 링크 : https://www.acmicpc.net/problem/9093

 

9093번: 단어 뒤집기

문제 문장이 주어졌을 때, 단어를 모두 뒤집어서 출력하는 프로그램을 작성하시오. 단, 단어의 순서는 바꿀 수 없다. 단어는 영어 알파벳으로만 이루어져 있다. 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는 공백이 하나 있다. 출력 각 테스트 케이스에 대해서, 입력으로 주어진 문장의 단어를 모두 뒤집어

www.acmicpc.net

 

문제

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

 

입력

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

 

출력

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

 

풀이

스택 사용 문제입니다!

문장이 주어지기 때문에 getline 함수로 문장을 받아야하는데,

여기서 중요한 것은 문장 하나만 받는 것이 아니기 때문에 getline(cin, string) 처럼 한 번 받아버리면 이미 test case에 남아있는 입력 버퍼 "\n"이 존재하기 때문에 한 번 비워주는 작업이 필요하다.

cin에 남은 입력버퍼를 지우기 위해서, cin.ignore() 함수를 사이에 한 번 써주자!

 

이후 공백이 나올 때 까지 만들어 둔 stack에 쌓고, 공백이 나오면 stack에 존재하는 모든 문자를 출력하며 pop하면, 단어가 거꾸로 뒤집혀서 나온다.

주의할 점은 마지막 단어는 뒤에 공백이 없기 때문에 나오지 않으므로 한 번더 pop하거나, 뒤에 공백 또는 개행 문자를 덧붙여 써주자!

 

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <stack>
#include <string>
using namespace std;
 
int main()
{
    int t; cin >> t;
    cin.ignore();
    while (t--) {
        string s = "";
        getline(cin, s);
        s += '\n';
        stack<char> st;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == ' ' || s[i] == '\n') {
                while (!st.empty()) {
                    printf("%c", st.top());
                    st.pop();
                }
                printf(" ");
            }
            else st.push(s[i]);
        }
        
    }
    return 0;
}
cs

개발환경 : Visual Studio 2019

지적, 조언 언제든지 환영입니다~~

'백준 문제풀이' 카테고리의 다른 글

백준 17413번 단어 뒤집기 2  (0) 2020.01.08
백준 1874번 스택 수열  (0) 2020.01.08
백준 9663번 N-Queen  (0) 2020.01.07
백준 1759번 암호 만들기  (0) 2020.01.07
백준 1764번 듣보잡  (0) 2020.01.07