[9093] C++ : 단어 뒤집기

2022. 8. 24. 02:27

 

문제

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

입력

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

출력

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

예제 입력 1 

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

예제 출력 1 

I ma yppah yadot
eW tnaw ot niw eht tsrif ezirp

 

풀이

이 문제는 작년 프로그래밍 기초 할 때 만나본 문제인 것 같다. 매우 간단한 문제 중 하나라고 생각한다. 작년에는 이 문제를 해결할 때  C언어를 사용했고 strtok로 단어 단위를 잘라서 단어 길이만큼 역순으로 출력하는 방법으로 풀었다.  근데 이제 보니 그런 방법 보다 스택을 사용하면 훨씬 간단하게 풀 수 있을 것 같았다. 

공백이 아니라면 스택에 하나씩 넣고 공백을 만나면 스택의 모든 요소를 하나씩 꺼내 출력하고 공백을 하나 출력하면 깔끔하게 문장이 반대로 출력된다. 

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


int main()
{
	int number;
	cin >> number;
	getchar();
	stack<char> s;
	for (int i = 0; i < number; i++) {
		string sentence;
		getline(cin, sentence);
		for (int j = 0; j < sentence.length(); j++)
		{
			if (sentence.at(j) == ' ')
			{
				while (1)
				{
					if (s.empty())
						break;
					cout << s.top();
					s.pop();
				}
				cout << ' ';
			}
			else
				s.push(sentence.at(j));
		}
		while (1)
		{
			if (s.empty()) {
				cout << '\n';
				break;
			}

			cout << s.top();
			s.pop();
		}

	}
	return 0;
}

 

이때까지 C++에서 한줄을 받는 방법을 몰랐는데 string 헤더에 있는 getline을 사용하면 된다는 것을 알게 되었다. 

BELATED ARTICLES

more