2 minute read

백준 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