본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 9093번: 단어 뒤집기 [C++]

문제 출처: www.acmicpc.net/problem/9093

 

9093번: 단어 뒤집기

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

www.acmicpc.net

1. 코드

#include <iostream>
#include <string>
#include <stack>

using namespace std;

int main(void)
{
	int n;
	cin >> n;
	cin.ignore();		//입력 버퍼 지워주기(cin 사용 후 \n가 입력버퍼에 남아있어서 getline에서 입력 처리가 된다.)
	while (n--)
	{
		string arr;
		getline(cin, arr);		//띄어쓰기 포함한 문자열 입력
		arr += ' ';				//문장의 끝도 변화시키기 위함
		stack<char> s;

		for (char ch : arr)		//배열 arr의 값을 순차적으로 ch에 저장
		{
			if (ch == ' ')			//문장의 중간 혹은 끝
			{
				while (!s.empty())	//스택이 비워질 때까지
				{
					cout << s.top();//문자 출력
					s.pop();
				}
				cout << ch;		//띄어쓰기 출력
			}
			else				//띄어쓰기가 입력이 안될 때
				s.push(ch);
		}
	}
	return 0;
}

(실행)

2. 풀이

cin.ignore();	//입력 버퍼 지워주기(cin 사용 후 \n가 입력버퍼에 남아있어서 getline에서 입력 처리가 된다.)

입력 버퍼를 지워주는 동작을 해주는데 cin을 이용해 입력하면 입력버퍼에 입력한 값이 저장이되고 그 값이 변수에 저장이 되는 방식인데 '\n'을 버린다. 그렇다면 버린 '\n'은 삭제가 되는가? 아니다. 그대로 입력버퍼에 남아있게 된다. 그런데 getline은 입력 버퍼에 있는 내용을 저장하기 때문에 '\n'이 입력이 된다. 그렇기 때문에 원래 3번 입력을 해야하는데 2번을 입력해야하는 상황이 발생한다. 이를 방지하기 위해서 ignore을 사용한다.

arr += ' ';	//문장의 끝도 변화시키기 위함

그리고 getline 같은 경우에는 '\n'을 입력버퍼에 제거를 한다. 그렇기 때문에 공백을 추가해주어서 문장의 중간 혹은 끝인 것을 알 수 있게 한다.

for (char ch : arr)		//배열 arr의 값을 순차적으로 ch에 저장

범위 기반의 for문을 이용하여 순차적으로 문자형 ch에 배열의 값을 저장한다.

if (ch == ' ')			//문장의 중간 혹은 끝
{
	while (!s.empty())	//스택이 비워질 때까지
	{
		cout << s.top();//문자 출력
		s.pop();
	}
	cout << ch;		//띄어쓰기 출력
}
else	//띄어쓰기가 입력이 안될 때
	s.push(ch);

만약 ch가 띄어쓰기를 한다면 스택이 비워질 때까지 스택 포인터에 있는 값을 출력 후 제거를 한다. 그리고 스택이 비워졌다면 띄어쓰기를 해준다. 만약 띄어쓰기 입력이 안됬다면 스택에 저장해준다.

3. 느낀 점

나에게 아직 생소한 범위 기반 for문과 ignore 그리고 스택을 이용한 풀이 방법에 대해 적응해야할 것 같다.