N
(백준 c++)17413 단어뒤집기2 본문
문제
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
- 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
- 문자열의 시작과 끝은 공백이 아니다.
- '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.
태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.
입력
첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.
출력
첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.
스택을 활용.
우선 태그는 뒤집으면 안된다.
단어만 뒤집어야하고, 띄어쓰기가 나오면 단어로 구분하여 뒤집어주어야 한다.
우선 s에 스트링을 받아오고 s.size()만큼 반복문 실행.
s[i]가 '<'라면 태그이므로 check를 true로 바꿔주고, answer에 '<'를 저장한다.
저장하기 전에 스택에 단어가 있다면 해당 단어를 꺼내서 answer에 저장하면 된다.
top부터 꺼내지기 때문에 단어는 뒤집어져서 answer에 저장된다.
만약 s[i]가 '>'라면 태그가 닫히는 것이므로 check를 false, answer에는 '>'를 저장.
마지막으로 s[i]가 태그가 아니라면 스택에 저장해야 한다.
만약 check가 true이면 현재 태그이기 때문에 answer에는 단어 그대로 저장해주면 된다.
false인 경우 단어에 해당한다.
만약 s[i]가 ' '라면 스택에 있는 단어를 뒤집어서 answer에 저장한다.
스택이 비워진 후 마지막에는 answer에 공백을 넣어줘서 단어를 구분해주면 된다.
s[i]가 공백이 아니라면 그냥 스택에 넣어줘서 저장.
마지막에는 스택이 비워질 때가지 단어를 꺼내서 answer에 저장하고, 출력하면 된다.
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main(void){
string s, answer = "";
stack<char> stk;
bool check = false;
getline(cin, s);
for(int i = 0; i < s.size(); i++){
if(s[i] == '<'){
while(!stk.empty()){
answer += stk.top();
stk.pop();
}
check = true;
answer += '<';
}
else if(s[i] == '>'){
check = false;
answer += '>';
}
else{
if(check){
answer += s[i];
}
else{
if(s[i] == ' '){
while(!stk.empty()){
answer += stk.top();
stk.pop();
}
answer += ' ';
}
else{
stk.push(s[i]);
}
}
}
}
while(!stk.empty()){
answer += stk.top();
stk.pop();
}
cout << answer << endl;
return 0;
}
'백준 알고리즘' 카테고리의 다른 글
(백준 c++)14889 스타트와 링크 (0) | 2020.12.28 |
---|---|
(백준 c++)1918 후위 표기식 (0) | 2020.12.27 |
(백준 c++)1935 후위표기식2 (0) | 2020.12.27 |
(백준 c++) 2580 스도쿠 (0) | 2020.09.21 |
(백준 c++) 9663 N-Queen (0) | 2020.09.21 |