문제링크 : https://www.acmicpc.net/problem/17413
17413번: 단어 뒤집기 2
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
stack<char>st;
void func()
{
while(!st.empty())
{
cout << st.top();
st.pop();
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string s, result;
getline(cin, s); //공백 포함 입력받기
for(int i=0; i<s.size(); i++)
{
if(s[i]=='<')
{
func(); //< 전 뒤집힌 문자 출력
while(s[i]!='>') //<> 사이 정상 출력
{
cout << s[i++];
}
cout << '>';
}
else if(s[i]==' ')
{
func(); //공백 전 뒤집힌 문자 출력
cout << " ";
}
else //뒤집힌 문자 저장
{
st.push(s[i]);
}
}
func(); //남아있는 문자 출력
return 0;
}
문자열이 뒤집히는 경우가 있으므로 스택을 이용했다 (후입선출)
먼저 현재 문자가 '<' 일때는 정상적으로 출력되어야 하므로 다음 문자가 '>'가 나올 때까지 문자를 계속해서 출력시켜준다.
이때 문자의 인덱스를 이동시키는 값을 반복문에서 사용했던 i 그대로 사용해야 하는데,
이는 현재 출력된 값들은 앞으로 탐색할 필요가 없기 때문이다.
따라서 이를 위해 같은 인덱스인 i를 증가시켜서 이후 탐색에서 스킵되도록 해준다.
그리고 '<' 앞에 문자가 있을 수도 있으므로 이 경우 스택에 담아뒀던 문자를 출력해준다.
현재 문자가 " "일 경우도 비슷하다.
문자가 " ", 이나 <> 기준으로 뒤집히기에 현재 값이 " "일 때 마찬가지로 스택에 값이 있다면 스택에 담긴 문자를 출력해준다.
이후 " "은 이어서 출력해준다.
이외의 경우에 이제 뒤집히는 문자 밖에 안남았으므로 스택에 전부 저장해주면 된다.
마지막으로 " "이나 <> 이후에도 스택에 남아있는 문자가 있을 수 있기에 스택에 남아있는 문자가 있는 지 다시 한번 체크하고 있다면 출력해준다.
'백준 > 실버' 카테고리의 다른 글
[백준 1254번] 팰린드롬 만들기 (C++) (0) | 2023.09.05 |
---|---|
[백준 1205번] 등수 구하기 (C++) (0) | 2023.09.03 |
[백준 1515번] 수 이어 쓰기 (C++) (0) | 2023.08.28 |
[백준 28293번] 자릿수 (C++) (0) | 2023.08.13 |
[백준 28279번] 덱 2 (C++) (0) | 2023.08.06 |