728x90
https://www.acmicpc.net/problem/17413
17413번: 단어 뒤집기 2
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져
www.acmicpc.net
주어진 조건만 맞추면 되는 문제인데, 반례들을 생각하면서 조건을 챙기면서 구현해줘야 한다.
<> 안의 문자열은 그대로 출력되어야 하므로
<가 나오면 flag 변수로 문자열을 그래도 추가
>가 나오면 flag 변수를 풀어주었다.
문자라면 tmp 문자열에 추가
빈칸이면 tmp 문자열 swap, tmp 문자열에 공백 추가
이렇게 하고, 더 생각해보자면
문자 뒤에 빈칸이 아니라 뒤에 <가 온다면 tmp 문자열을 ans에 넣어야 한다.
입력받은 s 문자열을 모두 돌았는데 빈칸이나 <가 끝에 없다면 tmp 문자열에 넣었던 문자열을 ans에 넣을 수 없으므로 for문이 끝난 뒤,
(입력 문자열 와 출력 문자열의 길이 다르면) 뒤에 tmp 문자열을 붙여준다.
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
string swapChar(string s){
string tmp = s;
for(int i=0; i<tmp.size()/2; i++){
swap(tmp[i], tmp[tmp.size()-i-1]);
}
return tmp;
}
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
string s, ans;
getline(cin, s);
string tmp;
bool flag = false;
for(int i=0; i<s.size(); i++){
if(s[i] == '<'){
flag = true;
ans += '<';
tmp = "";
}else if(s[i] == '>'){
flag = false;
ans += '>';
}else{
if(flag){ //괄호 열린 상태
ans += s[i]; //그냥 문자 넣음
}else{
if(s[i] != ' '){ //문자
tmp += s[i];
}else if(s[i] == ' '){ //빈칸
//뒤집기
ans += swapChar(tmp) + ' ';
tmp = "";
}
if(s[i+1] == '<') {
ans += swapChar(tmp);
}
}
}
}
if(ans.size() != s.size()) ans += swapChar(tmp);
cout << ans << '\n';
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준/c++] 16439번: 치킨치킨치킨 (0) | 2022.07.22 |
---|---|
[백준/c++] 17609번: 회문 (0) | 2022.07.19 |
[백준/c++] 16171번: 나는 친구가 적다(Small) (0) | 2022.07.18 |
[백준/c++] 4659번: 비밀번호 발음하기 (0) | 2022.07.18 |
[백준/c++] 1181번: 단어 정렬 (0) | 2022.07.18 |