#9093:단어 뒤집기
문제:
문장이 주어졌을 때, 단어를 모두 뒤집어서 출력하는 프로그램을 작성하시오. 단, 단어의 순서는 바꿀 수 없다. 단어는 영어 알파벳으로만 이루어져 있다.
입력:
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는 공백이 하나 있다.
풀이:
처음 이 문제를 풀 때 물자열을 팔고 공백 마다 계산을 해주었다. 또한, 공백이 첫번째 이거나 마지막일 때는 그 상황에 맞는 식을 따로 만들어 주었다. 그리고, 단어가 하나 밖에 없을 때도 예외 처리를 해주어야 했다.
하지만, 스택을 사용하면 훨씬 더 간단하게 답을 구현 할 수 있었다. 스택에 공백이 나올기 전까지 문자를 스택에 집어 넣은 다음 공백이 나올 때마다 스택을 비워주는 방법이다. 이 방법은 황인태님의 블로그에서 참고 하였다.
⭐ 앞으로 무언가를 순서를 거꾸로 뒤집어서 출력해야 될 때는 스택을 사용하는 방법이 좋은 방법인걸 기억해두면 좋을 것 같다.
코드:
#include <iostream>
using namespace std;
int n, empty_space[501];
int main(void){
cin >> n;
cin.ignore();
for(int i = 0; i < n; i++){
string str = "";
getline(cin, str);
int counter = 0;
for(int j = 0; j < str.size(); j++){
if(str[j] == ' '){
empty_space[counter]=j;
counter++;
}
}
//단어가 하나 밖에 없을 때
if(counter == 0){
for(int start = 0; start < str.size()/2; start++){
char temp;
temp = str[start];
str[start] = str[str.size()-1-start];
str[str.size()-1-start] = temp;
}
cout << str << endl;
}
//단어가 여러개 있을 때
else{
for(int k = 0; k < counter+1; k++){
//첫번째 공백
if(k == 0){
for(int start = 0; start < empty_space[k]/2; start++){
char temp;
temp = str[start];
str[start] = str[empty_space[k]-start-1];
str[empty_space[k]-start-1] = temp;
}
}
//마지막 공백
else if(k == counter){
for(int start = empty_space[k-1]+1; start < (empty_space[k-1]+str.size())/2+1; start++){
char temp;
temp = str[start];
str[start] = str[empty_space[k-1]+str.size()-start];
str[empty_space[k-1]+str.size()-start] = temp;
}
}
//중간 공백들
else{
for(int start = empty_space[k-1]+1; start < (empty_space[k]+(empty_space[k-1]+1))/2; start++){
char temp;
temp = str[start];
str[start] = str[empty_space[k]+empty_space[k-1]-start];
str[empty_space[k]+empty_space[k-1]-start] = temp;
}
}
}
cout << str <<endl;
}
}
}
코드(스택 사용):
출처: https://intaehwang.tistory.com/29
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main() {
int n;
cin >> n;
cin.ignore();
whie(n--){
string original = "";
getline(cin, original);
//마지막 단어도 뒤집어주기 위해 마지막 줄에 공백 추가
original += ' ';
stack<char> str;
for (int i = 0; i < original.size(); i++) {
//공백 보이면 단어 순서 거꾸로 출력
if (original[i] == ' ') {
while (!str.empty()) {
cout << str.top();
str.pop();
}
cout << original[i];
}
//공백 아니면 스택에 집어 넣기
else str.push(original[i]);
}
}
}
Leave a comment