#17413: 단어 뒤집기 2
문제:
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
- 알파벳 소문자(‘
a
’-‘z
’), 숫자(‘0
’-‘9
’), 공백(‘ ``’), 특수 문자(‘<
’, ‘>
‘)로만 이루어져 있다. - 문자열의 시작과 끝은 공백이 아니다.
- ’
<
‘와 ‘>
‘가 문자열에 있는 경우 번갈아가면서 등장하며, ‘<
‘이 먼저 등장한다. 또, 두 문자의 개수는 같다.
태그는 ‘<
‘로 시작해서 ‘>
‘로 끝나는 길이가 3 이상인 부분 문자열이고, ‘<
‘와 ‘>
‘ 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.
입력:
첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.
풀이:
이 문제는 #9093:단어 뒤집기 문제와 똑같이 풀면 되는데 태그인 경우에는 빼주면 된다. 따라서 몇 개의 조건문만 추가해주면 된다.
- 우선 현재 출력 해야 되는 문자가 tag인지 아닌지 구분하기 위해 boolean 변수를 만들어준다.
- 우선 태그 안쪽인지 아닌지 앞서 만든 bool 변수를 이용하여 if문으로 #9093:단어 뒤집기에서 구현한 뒤집기를 감싸준다. 추가로 ‘<’ 문자열도 공백과 같은 취급을 해주어야 뒤집히기 때문에 ‘<’ 문자열일 경우에도 전에 있던 단어들을 뒤집어 주며 ‘<’ 문자일 경우는 tag를 true로 바꿔준다.
- 처음 풀 때는 ‘<’ 전 단어들을 뒤집어 줘야 된다는 생각을 못하고 그냥 실행 하였더니 태그 시작과 붙어 있던 단어가 태그가 끝난 뒤 뒤집혀서 출력 되는 경우가 생겨서 추가 했다.
⭐이 처럼 문제를 풀 때는 보자 마자 모든 것이 바로 생각나서 구현 하는 것이 아닌 “대충 이렇게 구현하면 되지 않을까”하고 해본 뒤 생각 못한 버그가 발생하면 그때 고치는 방식으로 풀면 된다.
코드:
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main() {
string original = "";
bool tag = false;
getline(cin, original);
//마지막 단어도 뒤집어주기 위해 마지막 줄에 공백 추가
original += ' ';
stack<char> str;
for (int i = 0; i < original.size(); i++) {
//태그 아니니까 뒤집기
if(!tag){
//공백 보이면 단어 순서 거꾸로 출력
if (original[i] == ' '|| original[i] == '<') {
if(original[i] == '<') tag = true; //tag 안에 들어온걸 명시
while (!str.empty()) {
cout << str.top();
str.pop();
}
cout << original[i]; //공백 출력
}
//공백 아니면 스택에 집어 넣기
else str.push(original[i]);
}
//괄호 안 이니까 그대로 출력
else{
if(original[i] == '>') tag = false;
cout << original[i];
}
}
}
Leave a comment