https://www.acmicpc.net/problem/9093
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()를 쓰는 이유를 친절하게 설명한 블로그:
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 |
댓글