백준 9093번 : 단어 뒤집기

M1ndCon·2024년 6월 24일
0

Algorithm

목록 보기
1/32

  • 문제 선정 이유 : 알고리즘 문제 해결 재활 용 낮은 난이도 문제 풀이
  • Solved.ac 기준 브론즈 1
  • 사용언어 C++

문제 해석

  1. 문자열을 입력받고 문장 전체를 뒤집는 것이 아닌 단어 별로 뒤집는 것
  2. 단어를 뒤집을 기준점은 " "(공백)

문제 풀이

  1. 테스트 케이스 t를 입력 받는다.
  2. string 형태의 문자열을 입력 받는다.
  3. 문자열의 공백으로 나뉘기 전 단어들을 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()를 사용해 버퍼를 비우는 작업을 추가하면 문제 해결

profile
게임 개발자 지망생

0개의 댓글