BOJ 17413. 단어 뒤집기 2
🙇♀️[Silver III] 단어 뒤집기 2 - 17413
성능 요약
메모리: 2300 KB, 시간: 4 ms
분류
자료 구조, 구현, 스택, 문자열
제출 일자
2023년 12월 21일 15:44:04
문제 설명
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
- 알파벳 소문자('
a
'-'z
'), 숫자('0
'-'9
'), 공백('<
', '>
')로만 이루어져 있다. - 문자열의 시작과 끝은 공백이 아니다.
- '
<
'와 '>
'가 문자열에 있는 경우 번갈아가면서 등장하며, '<
'이 먼저 등장한다. 또, 두 문자의 개수는 같다.
태그는 '<
'로 시작해서 '>
'로 끝나는 길이가 3 이상인 부분 문자열이고, '<
'와 '>
' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.
입력
첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.
출력
첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.
🚀풀이
스택을 활용해서 뒤집기 문제를 풀었다.
뒤집어야하는 문자는 스택에 넣어두고 뒤집어야할 때, 스택에 있는 문자를 다 꺼내주는 방식이다.
void print(stack<char>& s)
{
while (s.empty() == false)
{
cout << s.top();
s.pop();
}
}
이렇게 스택에 있는 문자를 다 빼는 함수를 만들었다.
void solve()
{
getline(cin, str);
bool isIn = false;
for (char ch : str)
{
if (ch == '<')
{
print(s);
isIn = true;
cout << ch;
}
else if (ch == '>')
{
isIn = false;
cout << ch;
}
else if (isIn)
{
cout << ch;
}
else
{
if (ch == ' ')
{
print(s);
cout << ch;
}
else
{
s.push(ch);
}
}
}
print(s);
cout << res << '\n';
}
공백을 포함하여 문자를 받기위해서 getline
을 사용하였다.
bool을 활용해서 꺽쇠안에 있는 단어인지 아닌지 판별하였다.
🚀전체 코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
#include <stack>
using namespace std;
//string str;
string str;
string res;
stack<char> s;
void print(stack<char>& s)
{
while (s.empty() == false)
{
cout << s.top();
s.pop();
}
}
void solve()
{
getline(cin, str);
bool isIn = false;
for (char ch : str)
{
if (ch == '<')
{
print(s);
isIn = true;
cout << ch;
}
else if (ch == '>')
{
isIn = false;
cout << ch;
}
else if (isIn)
{
cout << ch;
}
else
{
if (ch == ' ')
{
print(s);
cout << ch;
}
else
{
s.push(ch);
}
}
}
print(s);
cout << res << '\n';
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
solve();
return 0;
}