본문 바로가기
Pro Developer/BaekJoon(DataStructure & Algorithm)

[백준 9093번] 단어 뒤집기 (C++)

by 성 언 2022. 2. 9.

https://www.acmicpc.net/problem/9093

 

9093번: 단어 뒤집기

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

www.acmicpc.net

이번 포스팅에서는 백준 9093번 문제를 학습합니다.

 

 

 

이 문제는 스택 라이브러리를 이용해 풀 수 있지만, 배열로 풀어보겠다. 

 

이번 문제에서는 cin 과 getline을 동시에 사용할 때 발생하는 문제에 대해서 짚고 넘어가자.

 

#include <iostream>
using namespace std;
int main(void)
{
    string s1,s2;

    cin >> s1;
    cout << s1 << endl;

    getline(cin,s2);
    cout << s2 << endl;

    
    return 0;
}

위에 코드에서 12  34(12 적은 후 두번 space 누른 후 34 입력)를 하면

12

  34

위와 같이 출력된다. 

12

34

처럼 출력되게 하려면 어떻게 해야할까?

이를 통해 우리는 다음과 같은 사실을 알 수 있다.

cin은 '\n'을 변수에 저장하지 않는다. --> 입력버퍼에 남아있다.
getline은 '\n'을 변수에 저장한다.

그렇기 때문에 입력버퍼에 남아있는 '\n'을 지우기 위해 cin.ignore()을 사용한다.

아래 코드에 마찬가지로 12  34(12 적은 후 두번 space 누른 후 34 입력)를 하면 어떻게 출력이 될까?

#include <iostream>
using namespace std;
int main(void)
{
    string s1,s2;

    cin >> s1;
    cout << s1 << endl;
    
    cin.ignore();
 
    getline(cin,s2);
    cout << s2 << endl;

    
    return 0;
}

출력 결과 

12

 34

위와 같이 출력된다.

이를 통해 우리는 다음과 같은 사실을 추가적으로 알 수 있다.

cin.ignore()은 입력받은 버퍼 전체를 비우는 것이 아니라 맨 앞의 문자 하나를 지운다.

따라서 위에 코드에서 cin.ignore()을 한번 더 추가해야 우리가 원하는 값이 출력된다.

 

이제 문제로 본격적으로 문제를 풀어보자.

 

#include <iostream>
#include <string>
using namespace std;

int main(){
    string c;
    
    int T;
    cin >> T;
    
    cin.ignore(); 
    
    for(int i = 0; i< T; i++){
        getline(cin, c);
        
        for ( int j = 0; j < c.size(); j++){
            if(c[j] == ' ') 
            {
                for(int k= j-1; c[k] !=' ' && k>=0; k--){   
                    cout<<c[k];
                }
                cout<<" ";
            }
        }
        for(int p = c.size()-1; c[p]!=' ' && p>=0; p--) 
            cout<<c[p];
            
        cout<<" \n";

    }
    
}

먼저 string을 선언하고, 테스트 케이스의 개수 T를 입력 받는다.

그 후, cin.ignore()을 통해 버퍼를 지운 후 T까지 for문을 반복한다. ( 표준 입력 버퍼에 개행문자 '\n'이 남아 있다.)

for문에서 c를 getline으로 입력 받고, c의 크기까지 반복하는 for문 안에서 c가 ' '이라면

공백이 발견된 위치보다 1작은 위치 부터 순서대로 출력한다. ( ' '을 만나면 거꾸로 뒤집어서 출력)

그 후, 공백을 출력한다.

이제 문장의 마지막 단어를 처리해줘야 한다.

마지막 문자열의 끝은 공백이 아니므로 문자열 c의 크기보다 작은 숫자부터 공백을 만나기 전까지 출력한다.

(문장의 끝에서 ' '을 처음 만나기 전까지 뒤집어서 출력)

그 후, 공백을 출력하고 줄을 바꾼다.

 

 

 

 

 

+) 이전 10828번과 이번 9093번 모두 스택 라이브러리를 활용해서도 풀 수 있는 문제입니다.

     기회가 있다면 스택 라이브러리로도 풀어보겠습니다!

 

 

*유의사항

- 공부 중인 인공지능공학과 대학생이 정리해서 남긴 정리입니다.

- 정확하지 않거나, 틀린 점이 있다면 댓글로 알려주시면 감사하겠습니다.

댓글