문제
문제 분석
- 문자열의 substr 함수를 이용해도 되고 deque을 이용해도 된다. 필자는 deque을 이용하여 풀이했다.
- 입력을 받을 때 띄어쓰기를 입력 종료로 받아들여지면 안되므로 getline으로 입력받는다.
- '<' 문자열이 나오면 이전 단어는 반대로 출력 + reverse_flag = false; 을 진행한다.
- '>' 문자열이 나오면 이전 단어는 그대로 출력 + reverse_flag = true; 을 진행한다.
- ' ' 문자열(띄어쓰기)이 나오면 reverse_flag 조건에 맞게 출력해준다.
- 일반 문자열이 입력되면 deque에 push 해준다.
- 단어를 그대로 출력하려면 front() 순서대로 출력해주고, 단어를 반대로 출력해주려면 back() 순서대로 출력해주면 된다.
- 이때 문제의 조건 2번에서 '문자열의 시작과 끝은 공백이 아니다.' 이므로 마지막 단어가 deque에 남게 될 수도 있다. (즉, 마지막 단어가 출력되지 않을 수 있다.) 그러므로 마지막 단어 출력을 reverse_flag 조건에 맞게 한 번 수행하면 된다.
정답 코드
// 풀이 시간 : 27분 50초
// 거꾸로 출력할 수도 있고 그대로 출력할 수도 있으므로 deque 자료구조를 사용하면 좋을 것 같다.
// < : 이전 단어는 반대로 출력 + reverse_flag = false; // 안에 있는 단어는 그대로 출력해주어야 함.
// > : 이전 단어는 그대로 출력 + reverse_flag = true; // 단어는 뒤집어서 출력해주어야 함.
// 띄어쓰기가 나오면 (즉, ' ') 문자열을 reverse_flag 조건에 맞게 출력해준다.
#include <iostream>
#include <deque>
#include <string>
using namespace std;
deque<char> dq;
int main(void) {
ios_base::sync_with_stdio(false); cin.tie(nullptr);
// 문장 입력받기
string sentence;
getline(cin, sentence);
// 출력 방식에 맞게 문장 출력
bool reverse_flag = true; // true : 단어를 거꾸로 출력
for (int i = 0; i < sentence.size(); i++) {
if (sentence[i] == '<') {
// '<' 이전 단어까지는 반대로 출력
while (!dq.empty()) {
cout << dq.back();
dq.pop_back();
}
cout << '<';
reverse_flag = false; // 이후 단어 그대로 출력 모드로 변경
}
else if (sentence[i] == '>') {
// '>' 이전 단어까지는 그대로 출력
while (!dq.empty()) {
cout << dq.front();
dq.pop_front();
}
cout << '>';
reverse_flag = true; // 이후 단어 뒤집기 모드로 변경
}
// 띄어쓰기가 나오면 조건에 맞게 단어 출력
else if (sentence[i] == ' ') {
// 단어 그대로 출력
if (reverse_flag == false) {
while (!dq.empty()) {
cout << dq.front();
dq.pop_front();
}
}
// 단어 반대로 출력
else if (reverse_flag == true) {
while (!dq.empty()) {
cout << dq.back();
dq.pop_back();
}
}
cout << " ";
}
// 일반 단어의 경우 deque에 push
else {
dq.push_back(sentence[i]);
}
}
// 마지막 단어 처리
if (reverse_flag == false) {
while (!dq.empty()) {
cout << dq.front();
dq.pop_front();
}
}
else if (reverse_flag == true) {
while (!dq.empty()) {
cout << dq.back();
dq.pop_back();
}
}
return 0;
}
교훈점
- 순서대로 출력, 역순으로 출력의 경우 deque을 사용하면 유용하다.