알고리즘 공부/백준
9093 단어 뒤집기 by C++
당장하자
2022. 7. 2. 13:28
문제
https://www.acmicpc.net/problem/9093
9093번: 단어 뒤집기
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는
www.acmicpc.net
해결한 방법
1. 각 줄을 getline으로 string 변수에 저장
2. ' '를 기준으로 vector로 나눠서 각 단어를 reverse 한 다음 저장
3. 단어 사이에 " "를 삽입하면서 출력
#include <iostream> // 입출력(cin, cout)
#include <string> // string
#include <vector> // vector
#include <sstream> // istringstream
#include <algorithm> // reverse
using namespace std;
vector<string> split(string str, char delim);
int main()
{
int line_num = 0;
cin >> line_num;
cin.ignore();
string buffer;
string result;
int i;
for (i = 0; i < line_num; i++)
{
getline(cin, buffer);
vector<string> buffer_split = split(buffer, ' ');
for (int j = 0; j < buffer_split.size(); j++)
{
reverse(buffer_split[j].begin(), buffer_split[j].end());
}
result = buffer_split[0];
for (int j = 1; j < buffer_split.size(); j++)
{
result += " ";
result += buffer_split[j];
}
cout << result << endl;
}
}
vector<string> split(string str, char delim)
{
istringstream iss(str);
string buffer;
vector<string> result;
while (getline(iss, buffer, delim))
result.push_back(buffer);
return result;
}
생각보다 시간이 오래 걸려서 다시 고민해보았습니다.
vector로 따로 저장하지말고 string 선에서 처리하는 방법은 없을까?
개선된 방법
1. 입력받는 줄을 getline으로 string 변수에 저장
2. string을 처음부터 끝까지 탐색하며 공백(' ')을 찾으면 reverse하지 않은 부분부터 공백 전까지 reverse
3. string 출력
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
int line_num;
cin >> line_num;
cin.ignore();
while (line_num--)
{
string s;
getline(cin, s);
int size = s.size();
int lastpos = 0;
for (int i = 0; i < size; i++)
{
if (s[i] == ' ')
{
reverse(s.begin() + lastpos, s.begin() + i);
lastpos = i + 1;
}
}
reverse(s.begin() + lastpos, s.end());
cout << s << endl;
}
}
위 방법은 백준 putdata님의 코드를 참고했습니다.