포스트

BOJ 9093. 단어 뒤집기

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

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

1. 문제 해석

스택은 데이터를 넣을때와 꺼낼때 역순으로 꺼내진다. 예를 들어, C, B, A 순으로 데이터가 삽입되었다면, 하나씩 Pop하여 출력해보면 A, B, C가 출력될 것이다.

단어 뒤집기 문제도 이러한 스택의 성질을 이용하면 쉽게 해결할 수 있다. I am happy today 라는 문자열이 주어졌다면 I ma yppah yadot로 출력될 것이다. 먼저, I가 스택에 들어간다. -> 공백문자가 들어온다. -> 스택을 비워주면서 출력한다. (I가 출력) -> a가 스택에 들어간다. -> m이 스택에 들어간다. -> 공백문자가 들어온다. -> 스택을 비워주면선 출력한다. (ma가 출력) -> … 이렇게 계속 반복하다 보면 단어를 뒤집어서 출력할 수 있다.

2. 문제 풀이

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
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr); // 입출력 속도 향상 
    int t; cin >> t;
    cin.ignore(); // 개행 문자가 없어서 getline()이 문자열을 못받는경우 방지 
    while (t--) {
        string str;
        getline(cin, str);
        str += '\n';
        stack<char> s;
        for (char ch : str) {
            if (ch == ' ' || ch == '\n') { // 공백이거나 개행문자이면 
                while (!s.empty()) { // 스택을 전부 비워주면서 출력 
                    cout << s.top();  
                    s.pop();
                }
                cout << ch;
            } else { // 공백이나 개행문자가 아니면 스택에 차곡차곡 담아준다. 
                s.push(ch);
            }
        }
    }
    return 0;
}

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

댓글

아직 댓글이 없습니다