
https://www.acmicpc.net/problem/17413
17413번: 단어 뒤집기 2
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져
www.acmicpc.net
태그 : <, >으로 둘러싸여 있음. 그 안에는 알파벳 소문자와 공백이 들어갈 수 있다.
단어 : 알파벳 소문자와 숫자로 이루어져있다. 연속된 단어는 공백으로 구분한다.
태그인 경우에는 그대로 출력, 단어인 경우에만 거꾸로 출력한다.
그래서 tag 안에 있는 경우를 bool 자료형으로 구분하였고, 단어를 stack에 담아 일정 조건이 되면(공백이 나타난다거나, '<'가 나온다거나) 출력하도록 하였다.
전체 코드는 아래와 같다.
#include <iostream>
#include <stack>
#include <string>
using namespace std;
string S;
stack<char> mystack; // 문자열 하나씩 담음
void print() { // stack 출력
int size = mystack.size();
for (int i = 0; i < size; i++) {
cout << mystack.top();
mystack.pop();
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
getline(cin, S);
int i = 0; bool istag = false;
while (i<S.length()) {
if (istag) { // tag 안에 있다면
cout << S[i];
if (S[i] == '>') { // tag 닫히면
istag = false; // 다시 false
}
}
else { // tag 안에 있지 않다면
if (S[i] == '<') { // tag가 시작됐다면
print(); // 그 전에 담아놨을지도 모를 단어 출력
cout << S[i];
istag = true;
}
else {
if (S[i] == ' ') { // tag 안에 있지도 않고 공백이 나타났다면 단어
print(); // 거꾸로 단어 출력
cout << S[i]; // 공백은 뒤에 출력
}
else { // 단어가 입력되고 있다면
mystack.push(S[i]); // 단어이므로 stack에 push
if (i == S.length() -1) { // 맨 마지막에 단어가 오는 경우
print();
}
}
}
}
i++;
}
}

'백준' 카테고리의 다른 글
[10866] 덱 (0) | 2022.11.04 |
---|---|
[10845] 큐 (0) | 2022.11.03 |
[2156] 포도주 시식 (0) | 2022.10.31 |
[2579] 계단 오르기 (0) | 2022.10.31 |
[9461] 파도반 수열 (0) | 2022.10.30 |
댓글