[백준] 17413 단어 뒤집기2 (C++)


17413 | 단어 뒤집기2

🙋‍♀️ 문제


문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.

먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.

알파벳 소문자(‘a’-‘z’), 숫자(‘0’-‘9’), 공백(‘ ‘), 특수 문자(‘<’, ‘>’)로만 이루어져 있다. 문자열의 시작과 끝은 공백이 아니다. ‘<’와 ‘>’가 문자열에 있는 경우 번갈아가면서 등장하며, ‘<’이 먼저 등장한다. 또, 두 문자의 개수는 같다. 태그는 ‘<’로 시작해서 ‘>’로 끝나는 길이가 3 이상인 부분 문자열이고, ‘<’와 ‘>’ 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.

🙌 입출력


첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.

첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.

🙋‍♂️ 예제 입출력


baekjoon online judge
noojkeab enilno egduj

<int><max>2147483647<long long><max>9223372036854775807
<int><max>7463847412<long long><max>7085774586302733229

🚀 코드


#include <iostream>
#include <string>
using namespace std;

int main() {
	string s;
	string tmp;
	bool flag = false;
  getline(cin, s);
	getchar();
	for (int i = 0; i < s.size() + 1; i++) {
		if (s[i] == '<') {
			flag = true;
			// 두 번째 이후의 태그부터는 tmp에 저장된 문자가 있을 수 있음
			while (true) {
				if (tmp.empty()) {
					break;
				}
				char x = tmp.back();
				cout << x;
				tmp.pop_back();
			}
			cout << s[i];
		}
		else if (s[i] == '>') {
			flag = false;
			cout << s[i];
		}
		else if (flag == false) {
			if (s[i] == ' ' || s[i] == '\0') {
				// 공백을 만나면 tmp에 저장되어 있던 문자들 pop
				while (true) {
					if (tmp.empty()) {
						break;
					}
					char x = tmp.back();
					cout << x;
					tmp.pop_back();
				}
				if (s[i] != ' ') {
					// s[i] == '\0'일 경우 바로 종료
					break;
				}
				else cout << s[i];
			}
			else tmp.push_back(s[i]);
		}
		else cout << s[i]; // flag가 true일 경우에만 실행됨
	}
	while (true) {
		if (tmp.empty()) {
			break;
		}
		int x = tmp.back();
		cout << x;
		tmp.pop_back();
	}
	cout << '\n';
	return 0;
}

🌠 메모


맨 처음 코드를 짤 때는 많이 해맸다. 문자열을 오랜만에 다뤄서 그런 것 같다.
list의 push_front(), push_back() 같은 함수에 익숙해져서 그걸 사용하려고만 했더니 stack구조를 생각하지 못했다. 간단하게 pop_back()으로 구현 가능했다.

워낙 예외상황이 많아 깔끔하게 처리하기 어려웠는데 결국 질문글의 코드를 참고하여 코드를 한번 엎고 다시 짰다.
처음에 짠 코드는 '<'를 만나면 '>'를 만나기 전까지 순차적으로 출력하고 그만큼 i를 더해줬는데 이럴 경우, 역순으로 출력되던 문자열이 ‘<’를 만났을 때 처리하기 매우 복잡해져서 관뒀다.




# 카테고리