문제
문장이 주어졌을 때, 단어를 모두 뒤집어서 출력하는 프로그램을 작성하시오. 단, 단어의 순서는 바꿀 수 없다. 단어는 영어 알파벳으로만 이루어져 있다.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는 공백이 하나 있다.
출력
각 테스트 케이스에 대해서, 입력으로 주어진 문장의 단어를 모두 뒤집어 출력한다.
Solved.ac 레벨
브론즈 I
풀이
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t;
cin >> t;
cin.ignore();
while(t--){
string input;
stack<char> st;
getline(cin, input);
input += ' ';
for(int i = 0; i < input.length(); i++){
if(input[i] == ' '){
while(!st.empty()){
cout << st.top();
st.pop();
}
cout << input[i]; //공백 출력
} else {
st.push(input[i]);
}
}
}
return 0;
}
공백을 포함한 문자열을 받기 위해서는 getline()을 활용해주어야 하며, ignore()로 버퍼 내에 남아있는 개행문자를 지워준다.
문자열을 뒤집는 것은 가장 먼저 들어간 요소가 맨 마지막으로 나오는 자료구조 (FILO : First In Last Out)인 스택을 활용하였다.
문자열의 길이만큼 반복하며 다음과 같은 과정을 반복한다.
1. input의 i번째가 공백인 경우
단어가 끝났다고 판단하여 스택이 빌 때까지 스택에서 요소를 꺼내며 출력한다.
스택이 비면 공백 하나를 출력하여 원문과 동일한 구조를 유지한다.
2. input의 i번째가 공백이 아닌 경우
스택에 단어의 알파벳을 하나씩 집어넣는다.
'Study (etc) > Problem Solving' 카테고리의 다른 글
[BOJ / C++] 2688번 : 줄어들지 않아 (0) | 2023.03.13 |
---|---|
[BOJ / C++] 10828번 : 스택 (0) | 2023.03.10 |
[BOJ / C++] 1946번 : 정수 삼각형 (0) | 2023.03.03 |
[BOJ / C++] 2156번 : 포도주 시식 (1) | 2023.03.03 |
[BOJ / C++] 24479번 : 알고리즘 수업 - 깊이 우선 탐색 1 (0) | 2023.02.14 |