
- 문제 선정 이유 : 알고리즘 문제 해결 재활 용 낮은 난이도 문제 풀이
- Solved.ac 기준 브론즈 1
- 사용언어 C++
문제 해석
- 문자열을 입력받고 문장 전체를 뒤집는 것이 아닌 단어 별로 뒤집는 것
- 단어를 뒤집을 기준점은 " "(공백)
문제 풀이
- 테스트 케이스 t를 입력 받는다.
- string 형태의 문자열을 입력 받는다.
- 문자열의 공백으로 나뉘기 전 단어들을 stack에 쌓아주고 다시 공백이 나오면 pop해줘서 문자를 재배치
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main() {
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int t; // 테스트 케이스
string str = ""; // 각 테스트 케이스마다 입력 받을 문장
stack<char> stkChar = {}; // 각 글자를 받을 Stack
cin >> t;
cin.ignore(); // 버퍼에 남아있는 개행 문자 제거
while (t--) {
getline(cin, str); // 문장 입력 받기
str += " "; // 사이즈가 딱 맞을 경우 반복문이 전부 돌지 않아 마지막에 공백 추가
for (int i = 0; i < str.size(); i++) {
if (str[i] != ' ') { // 공백이 아니면
stkChar.push(str[i]); // 스택에 쌓아주고
}
else { // 공백이면
while (!stkChar.empty()) {
cout << stkChar.top(); // 출력
stkChar.pop(); // 출력 완료했으면 제거
}
cout << " "; // 공백 추가
}
}
cout << "\n";
}
return 0;
}
생긴 문제점와 해결
- 문제 : cin과 getline을 혼용할 때, cin이 버퍼에 남긴 개행 문자(\n)가 getline에 의해 빈 문자열로 읽혀 입력을 하나 건너 뛰게 됨
- 해결 : cin.ignore()를 사용해 버퍼를 비우는 작업을 추가하면 문제 해결
