문제
https://www.acmicpc.net/problem/9093
문제 풀이
이 문제는 스택을 사용하여 푸는 문제이다.
하지만 입출력 또한 중요한 문제이다.
string 변수와 cin을 통해 'I am happy today'를 받으려고 하면 'I'만을 저장하게 된다.
왜냐하면 공백을 만나면 문자열의 끝으로 인식하여 'I' 만을 저장하게 된다.
그래서 다른 방법이 필요하다.
바로 getline을 이용하는 것이다.
getline은 두가지 종류가 존재한다. istream라이브러리의 cin.getline(), string 라이브러리의 istream& getline()이 존재한다.
cin.getline
cin.getline (char* s, streamsize n, char delim);
첫번째 인자는 char 배열의 시작점
두번째 인자는 저장할 문자열의 크기
세번째 인자는 제한자 혹은 구분 문자로 문자열의 끝을 판단할 문자 (Default로 '\n'이 지정되어 있다.)
istream& getline
istream& getline (istream& is, string& str, char delim);
첫번째 인자는 입력스트림의 오브젝트 ex) cin
두번째 인자는 string 변수의 시작주소
세번째 인자는 제한자 혹은 구분 문자로 문자열의 끝을 판단할 문자 (Default로 '\n'이 지정되어 있다.)
주의해야 할 점
int N;
cin >> N;
char input1[100];
string input2;
cin.getline(input1, 100);
getline(cin, input2);
cout << N << '\n';
cout << input1 << '\n';
cout << input2 << '\n';
/*
입력:
5
Hello
World!
출력:
5
Hello
*/
왜 input1에 'Hello'가 들어가지 않고 input2에 'Hello'가 들어가 있을까
cin이 처음 '5'를 입력받을 때 공백을 무시했기 때문에 버퍼에 공백이 그대로 남아있었기 때문에 getline 다음 입력을 받을때 그 공백이 읽혀버리는 것이다.
cin 이라는 입력함수 자체가 띄어쓰기, 엔터, 탭 등의 Whitespace들을 무시하고 버퍼에 남겨버리기 때문에 getline이나 다른 입력함수와 같이 써야하는 경우 cin.ignore()를 통해 버퍼들을 비워줘야 한다.
getline은 '\n'을 이미 구분 문자로 설정되어 있기때문에 버퍼에 남기지 않기 때문에 버퍼 문제를 걱정할 필요는 없다.
int N;
cin >> N;
cin.ignore();
char input1[100];
string input2;
cin.getline(input1, 100);
getline(cin, input2);
cout << N << '\n';
cout << input1 << '\n';
cout << input2 << '\n';
/*
입력:
5
Hello
World!
출력:
5
Hello
World!
*/
반대로 cin이라는 입력함수만 쓴다면 정상적인 결과를 확인할 수 있다.
int N;
cin >> N;
cin.ignore();
char input1[100];
string input2;
cin >> input1;
cin >> input2;
cout << N << '\n';
cout << input1 << '\n';
cout << input2 << '\n';
/*
입력:
5
Hello
World!
출력:
5
Hello
World!
*/
그럼 정상적으로 이제 입력을 받았다고 쳤을 때, 문제에서는 각 단어별로 뒤집으라는 조건이 있다. 그렇다면 하나의 문자열을 받고 공백 혹은 '\n'을 만나기 전까지 스택에 push를 하다가 공백 혹은 '\n'을 만나면 pop하여 출력 해준다면 해결될 것이다.
추가적으로 getline은 '\n'을 구분자로서 받아들이기 때문에 문자열 변수에 저장이 되지 않기 때문에 따로 문자열을 받고 나서 추가를 해줘야 한다.
전체 코드
#include <bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N;
cin.ignore();
while(N--){
stack<char> input;
string temp;
getline(cin, temp);
temp += '\n';
for(register int i = 0; i < temp.length(); i++){
if(temp[i] == ' ' || temp[i] == '\n'){
while(!input.empty()){
cout << input.top();
input.pop();
}
cout << ' ';
}
else{
input.push(temp[i]);
}
}
cout << '\n';
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 에디터 (1406번) c++ (0) | 2023.04.18 |
---|---|
백준 9012번(괄호) (0) | 2023.04.17 |
백준 1620번(나는야 포켓몬 마스터 이다솜) c++ (0) | 2023.04.16 |
백준 1269번 (대칭 차집합) c++ (0) | 2023.04.14 |
백준 1065번(한수) c++ (0) | 2023.04.09 |
댓글