본문 바로가기
Algorithm/BOJ

[BOJ]9093번: 단어 뒤집기(c++)

by HBGB 2020. 4. 14.

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

 

9093번: 단어 뒤집기

문제 문장이 주어졌을 때, 단어를 모두 뒤집어서 출력하는 프로그램을 작성하시오. 단, 단어의 순서는 바꿀 수 없다. 단어는 영어 알파벳으로만 이루어져 있다. 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는 공백이 하나 있다. 출력 각 테스트 케이스에 대해서, 입력으로 주어진 문장의 단어를 모두 뒤집어

www.acmicpc.net

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <stack>
#include <string>
 
using namespace std;
 
int main()
{
    // iostream 입출력 속도 향상
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
 
    int n;
    cin >> n;
    cin.ignore(1'\n');    // input stream 비워주기 : 1번째 인자 개수만큼 && 2번째 인자까지
 
    while (n--)
    {
        // 한 줄씩 입력받고, 개행문자 출력을 위해 '\n' 추가
        string line;
        getline(cin, line);
        line += '\n';
 
        stack<char> s;
        for (char c : line)
        {
            // ' ' 또는 '\n'이 오면 스택 비우기
            if (c == ' ' || c == '\n')
            {
                while (!s.empty())
                {
                    cout << s.top();
                    s.pop();
                }
                cout << c;
                continue;
            }
 
            // 일반 문자는 스택 추가
            s.push(c);
        }
    }
 
    return 0;
}
Colored by Color Scripter
 

 

 

TIP

cin.ignore() 때문에 한참 애를 먹었다.

c의 fflush(stdin) 이나 java의 flush()와 비슷한, 입력버퍼를 비워주는 함수이다.

 

1
2
3
4
5
6
7
8
    int n;
    cin >> n;
    cin.ignore(1'\n');    
 
    while (n--)
    {
        string line;
        getline(cin, line);
예제 : 
2
I am happy today
We want to win the first prize

 

테스트 케이스 카운팅을 위해서 변수 n에 숫자를 입력받았다. 

n에는 이제 2가 입력되었지만, 그 다음 개행문자 '\n'는 어디로 갈까?

 

'\n'입력버퍼에 그대로 남아버린다!

그래서 첫번째 테스트 케이스는 '\n' 를 입력받게 된다.

두번째 테스트 케이스가 "I am happy today"를 입력받게 된다. 

 

따라서 cin.ignore()를 통해서 입력 버퍼를 말끔히 비워주어야 한다. 

디폴트 파라미터가 있기 때문에,

cin.ignore() 또는 cin.ignore(count, delim) 둘다 사용 가능하다. 

 

 

cin.ignore()를 쓰는 이유를 친절하게 설명한 블로그: 

http://blog.naver.com/PostView.nhn?blogId=lyw94k&logNo=220859905348&categoryNo=11&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=search

 

cin.ignore()의 명세를 정확하게 알고 싶다면? :

https://en.cppreference.com/w/cpp/io/basic_istream/ignore

 

 

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ]1874번: 스택 수열(c++)  (0) 2020.04.14
[BOJ]9012번 : 괄호(c++)  (0) 2020.04.14
[BOJ]11721번: 열 개씩 끊어 출력하기(c++)  (0) 2020.04.13
[BOJ]10828번: 스택(c++)  (0) 2020.04.12
[BOJ]1987번 : 알파벳(java, c++)  (0) 2020.01.18

댓글