문제 링크: https://www.acmicpc.net/problem/1662
음; 어렵습니다
재귀함수나 스택을 써야 하는데요 재귀함수를 써봤습니다.
예를 들어 12(34)5 입력이 이렇게 들어오면 '1'의 길이 + 2*('34'의 길이) + '5'의 길이 이렇게 계산을 해주면 됩니다. 여기서 길이를 구하는 함수를 재귀함수로 만들면 됩니다.
이때 같은 depth의 괄호 안에 여러개의 괄호쌍이 있는 경우 ex) 3(2(2)2(2)) 를 체크해줘야 하니 인덱스 계산에 주의가 필요합니다. 처음엔 string::find_first_of('(')
, string::find_last_of(')')
이걸로 인덱스를 계산해줬는데 계속 틀려서 생각을 좀 해보니 반례가 있어서 수정을 했습니다
#include <bits/stdc++.h>
using namespace std;
int get_length(const string& s) {
int par_open = -1, par_close = -1;
int counter = 0;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == '(') {
++counter;
if (par_open == -1)
par_open = i;
}
else if (s[i] == ')') {
--counter;
if (counter == 0) {
par_close = i;
break;
}
}
}
if (par_open != -1 && par_close != -1) {
return get_length(s.substr(0, par_open - 1))
+ (s[par_open - 1] - '0') * get_length(s.substr(par_open + 1, par_close - par_open - 1))
+ get_length(s.substr(par_close + 1));
}
else {
return s.size();
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
string s;
cin >> s;
cout << get_length(s) << '\n';
return 0;
}
다른 사람들 풀이를 보니 엄청 짧고 이해할 수 없는 코드가 있네요. 나중에 한 번 참고해서 풀어봐야겠습니다.
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 1411: 비슷한 단어 (0) | 2020.08.01 |
---|---|
[백준][C++] 14502: 연구소 (0) | 2020.08.01 |
[백준][C++] 5719: 거의 최단 경로 (0) | 2020.08.01 |
[백준][C++] 3182: 한동이는 공부가 하기 싫어! (0) | 2020.07.31 |
[백준][C++] 3181: 줄임말 만들기 (0) | 2020.07.31 |