Solved.ac 골드5
https://www.acmicpc.net/problem/1662

압축되지 않은 문자열 S가 주어졌을 때, 이 문자열중 어떤 부분 문자열은 K(Q)와 같이 압축 할 수 있다.
K는 한자리 정수이고, Q는 0자리 이상의 문자열이다.이 Q라는 문자열이 K번 반복된다는 뜻이다.
압축된 문자열이 주어졌을 때, 이 문자열을 다시 압축을 푸는 프로그램을 작성하시오.
첫째 줄에 압축된 문자열 S가 들어온다. S의 길이는 최대 50이다.
문자열은 (, ), 0-9사이의 숫자로만 들어온다.
첫째 줄에 압축되지 않은 문자열의 길이를 출력한다.
이 값은 2,147,473,647 보다 작거나 같다.
알고리즘 분류
- 자료구조
- 스택
- 재귀
입력된 문자열 S에서 ")" 가 나올 때마다 함수를 실행시켜서 압축을 푼다
#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
int ans;
string S;
stack<char> st;
int solve() {
char c;
int len = 0;
while (!st.empty()) {
c = st.top();
st.pop();
if (c == ')') {
len += solve();
}
else if (c == '(') {
int cnt = st.top() - 48;
st.pop();
return cnt * len;
}
else {
len++;
}
}
return len;
}
int main() {
fastio;
cin >> S;
for (char c : S)
st.push(c);
cout << solve();
return 0;
}