10
20
  • 사용 언어 C++
  • 백준 9093번 단어 뒤집기 문제

문제

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

입력

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

출력

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

 

코드

더보기
#include <iostream>
#include <stack>
#include <string>
using namespace std;

int main()
{
	int n;
	string text;
	//단어 저장을 위해 char 값 저장
	stack <char> t;

	cin >> n;
	//버퍼 지우기
	cin.ignore();
	while (n--)
	{
		getline(cin, text);
		text += " ";

		for (int i = 0; i < text.size(); i++)
		{
			if (text[i] == ' ')
			{
				while (!t.empty())
				{
					cout << t.top();
					t.pop();
				}
				cout << " ";
			}
			else
				t.push(text[i]);
		}
		cout << "\n";
	}

	return 0;
}

C++의 모르는 기능을 많이 배우고 간다.

 

오늘 문제는 문장을 입력하고 그 문양을 거꾸로 출력한다. 거꾸로 출력하는 부분은 어제 배운 stack의 top 기능을 활용하면 케이크 자르듯 간단하게 할 수 있다.

 

다만 문제는 문장을 입력받는 거다. string으로 cin 입력밖에 모르는 나로써는 수많은 고민을 하게 만들었고 구-글의 힘을 빌려 답을 어느정도 찾아내었다.

 

cin.ignore()과 getline을 써서 해결하는 문제였다.

문장을 입력할 때 공백을 포함해서 써야되는데 그 부분은 getline을 사용하여 공백 포함 문제를 입력받을 수 있다!

그리고 ignore은 앞에 입력할 문장이 몇개인지 적고나서 뒤에 getline을 사용하면 제대로 출력되지 않을 것이다. 이것은 표준 입력 버퍼에 개행문제(\n)이 남아있어 문제가 발생하는 것이기에 cin.ignore()로 버퍼를 비워주면 해결된다.

 

cin.clear()이라는 함수도 비슷한 개념인것 같지만 이건 버퍼를 비워주는것이 아니라 내부 상태 플러그 값을 초기화 해주는 것이기에 버퍼를 지우는 상황이면 얌전히 cin.ignore()을 사용해주는 것이 좋다.

 

문장을 입력하고 출력할때 구분하기 쉽게 공백을 넣어줬다.

만약 I am happy를 입력하면 text는 최종적으로 I am happy 공백 인 셈이다.

 

텍스트의 크기만큼 for문을 돌려준다. 이러면 문장의 크기만큼 for문이 도는 것이다.

if 문에서 공백은 입력한 문장에서 중앙과 끝부분 체크를 해준다.

공백이 입력되지 않을때는 텍스트를 stack에 저장하고 공백이 입력된 경우 stack이 공백이 아니라면 그 전에 입력한 값을 거꾸로 출력되게 해준다. 그리고 다한 뒤에는 공백을 출력해 띄어쓰기를 해준다.

 

한줄이 전부 출력이 되면 다음 줄로 넘어가는 작업도 진행해줘야된다.

 

이렇게 코드를 작성하니 통과가 되었다. stack을 활용하는 부분은 괜찮지만 아직 문제를 이해하는 것이 느려서 고역이다. 끄아악

 

 

'코딩 > 코드 문제 묶음' 카테고리의 다른 글

C++ 연습 문제_2  (1) 2024.12.23
C++ 연습 문제_1  (1) 2024.12.23
오늘의 코딩 2일차  (0) 2023.10.19
오늘의 코딩 1일차  (1) 2023.10.17
오늘의 코딩 0일차  (0) 2023.10.14
COMMENT