~cpp
// no 848
//#include <fstream>
#include <iostream>
#include <string>
using namespace std;
const int STATE_A = 1;
const int STATE_B = 2;
const int STATE_C = 3;
//fstream fin("input.txt");
//fstream fout("output.txt");
void read_file(string & str);
void remove_enter(string & str);
void restruct_string(string & str);
void remove_string_end_space(string & str);
int main()
{
string str;
read_file(str);
remove_enter(str);
restruct_string(str);
remove_string_end_space(str);
cout << str;
return 0;
}
void read_file(string & str)
{
char ch;
while (1)
{
if (cin.peek() == EOF)
break;
ch = cin.get();
str += ch;
}
}
// step1
void remove_enter(string & str)
{
int state = STATE_A;
for (int i = 0; i < str.length(); i++)
{
if (state == STATE_A)
{
if (str[i] == '\n' || str[i] == ' ')
continue;
else
state = STATE_B;
}
else if (state == STATE_B)
{
if (str[i] == '\n')
{
if (str[i + 1] == ' ' || str[i + 1] == '\n')
state = STATE_A;
else
{
str[i] = ' ';
i--;
while (str[i] == ' ')
{
str.erase(&str[i]);
i--;
}
i++;
state = STATE_A;
}
}
}
}
}
// step2
void restruct_string(string & str)
{
int count_char = 0;
int state = STATE_A;
bool isEmptyLine = true;
for (int i = 0; i < str.length(); i++)
{
if (state == STATE_A)
{
isEmptyLine = true;
count_char = 0;
// test
if (str[i] == '\n')
continue;
else if (str[i] != ' ')
isEmptyLine = false;
count_char++;
state = STATE_B;
}
else if (state == STATE_B)
{
// 줄 끝의 빈칸을 제거하는것은 빈줄이 아닐때만
if (str[i] == '\n' && isEmptyLine == false)
{
i--;
while (str[i] == ' ')
{
str.erase(&str[i]);
i--;
}
i++;
state = STATE_A;
continue;
}
// 빈줄일때
else if (str[i] == '\n' && isEmptyLine == true)
{
state = STATE_A;
continue;
}
else if (str[i] != ' ')
isEmptyLine = false;
count_char++;
if (count_char >= 73 && str[i] != ' ')
state = STATE_C;
}
else if (state == STATE_C)
{
if (str[i - 1] == ' ')
{
i--;
while (str[i] == ' ' && str[i - 1] == ' ')
{
str.erase(&str[i]);
i--;
}
str[i] = '\n';
state = STATE_A;
}
else
{
while (1)
{
i--;
if (str[i] == ' ')
{
while (str[i] == ' ' && str[i - 1] == ' ')
{
str.erase(&str[i]);
i--;
}
str[i] = '\n';
state = STATE_A;
break;
}
else if (str[i] == '\n' || i == 0)
{
while (str[i] != ' ')
i++;
while (str[i] == ' ' && str[i] != ' ')
{
str.erase(&str[i]);
}
str[i] = '\n';
state = STATE_A;
break;
}
}
}
}
}
}
// step3
void remove_string_end_space(string & str)
{
int i = str.size() - 1;
while (str[i] == ' ')
{
str.erase(&str[i]);
i--;
}
}