https://www.acmicpc.net/problem/9093
이번 포스팅에서는 백준 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번 모두 스택 라이브러리를 활용해서도 풀 수 있는 문제입니다.
기회가 있다면 스택 라이브러리로도 풀어보겠습니다!
*유의사항
- 공부 중인 인공지능공학과 대학생이 정리해서 남긴 정리입니다.
- 정확하지 않거나, 틀린 점이 있다면 댓글로 알려주시면 감사하겠습니다.
'Pro Developer > BaekJoon(DataStructure & Algorithm)' 카테고리의 다른 글
[백준 1158번] 요세푸스 문제 (C++) (0) | 2022.02.13 |
---|---|
[백준 10845번] 큐 (C++) (0) | 2022.02.13 |
[백준 1874번] 스택 수열 (C++) (0) | 2022.02.11 |
[백준 9012번] 괄호 (C++) (1) | 2022.02.09 |
[백준 10828번] 스택 (C++) (0) | 2022.02.09 |
댓글