반응형
문제
구현 방법
각 괄호마다 괄호 내부의 숫자들을 곱해주기 위하여 재귀를 통하여 구현했다. 크게 세 단계로 구성되어있으며, 먼저 붙어있는 괄호들을 A2B/A3B형식으로 숫자로 바꾸어준다. AB는 2 3 이 23인지 2와 3인지 숫자끼리 구분하기 위하여 덧붙였다. 그리고 이 과정에서 괄호의 갯수를 세며 존재가 불가능한지 판단한다.
이후 재귀를 돌며 괄호를 만나면 해당 괄호가 끝날때까지 그 사이에 있는 A?B에 괄호별 값을 곱해준다. 이때 string에서의 곱 이기 때문에 정수로 변환 후 곱한 후 해당 결과를 삭제->중간 삽입 하는 과정을 거쳐서 곱연산을 하게 되었다. 이를 재귀로 반복하여 문자열의 끝까지 있는 모든 괄호에 대하여 연산을 마치고, 이후 다시 순회하며 모든 숫자들을 더해준다
아쉬웠던점
중간 삽입/삭제가 없어도 가능할 것 같다. 대충 생각해봐도 자릿수는 하나 이상으로 늘어나지 않으니 기존에는 값을 변경해주고 자릿수가 바뀌면 삽입만 해줬어도 삭제는 필요 없었던 것 같다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void MytFind(string &_str, int _Num, char _Char = 'D')
{
_str[_Num] = 0; //앞으로 탐색 불가능하도록 괄호 0만들기
for (_Num++; _Num < _str.size(); ++_Num)
{
string _StrMax;
//괄호 시작 찾으면 재귀 돌림.
if (_str[_Num] == '(' || _str[_Num] == '[')
{
MytFind(_str, _Num, _str[_Num]);
if (_Char == 'D')
return;
}
//괄호 끝 찾으면 해당 함수 종료.
else if (_str[_Num] == ']' || _str[_Num] == ')')
{
if (_Char == 'D')
return;
_str[_Num] = 0; //끝괄호 0만들기
_Char = 'D';
}
//숫자 찾으면 곱해줌.
else if (_str[_Num] == 'A' && _Char != 'D')
{
int i;
//숫자 찾기
for (i = _Num+1; i < _str.size(); ++i)
{
if (_str[i] == 'B')
break;
_StrMax += (int)_str[i];
}
//자릿수 늘어날 경우 고려.
if (_Char == '(')
_StrMax = to_string(stoi(_StrMax) * 2);
else
_StrMax = to_string(stoi(_StrMax) * 3);
_str.erase(_Num, i-_Num+1);
_str.insert(_Num, "A" + _StrMax + "B");
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
string Str;
cin >> Str;
int Start = 0, End = 0, Start_1 = 0, End_1 = 0, Max = 0, First = -1;
//1. 한번 순회하며 초기 숫자 세팅.
for (int i = 0 ; i < Str.size(); ++i)
{
if (Str[i] == '(')
{
if (Str[i + 1] == ')')
{
Str.erase(i, 2);
Str.insert(i, "A2B");
}
else
{
++Start;
if (First == -1)
First = i;
}
}
else if (Str[i] == ')')
{
--Start;
}
else if (Str[i] == '[')
{
if (Str[i + 1] == ']')
{
Str.erase(i, 2);
Str.insert(i, "A3B");
}
else
{
++Start_1;
if (First == -1)
First = i;
}
}
else if (Str[i] == ']')
{
--Start_1;
}
if (Start_1 < 0 || Start < 0)
{
cout << "0";
return 0;
}
}
if (Start != 0 || Start_1 != 0)
{
cout << "0";
return 0;
}
//2. 재귀 돌며 괄호 풀어줌.
if (First != -1)
MytFind(Str, First, Str[First]);
//3. 재귀를 통하여 변환된 숫자들 합치기
for (int i = 0 ; i < Str.size() ; ++i)
{
if (Str[i] == 'A')
{
string NumStr = "0";
for (int j = i + 1; j < Str.size(); ++j)
{
if (j == 'B')
break;
NumStr += Str[j];
}
Max += stoi(NumStr);
}
}
cout << Max;
}
|
cs |
잡설
특정 상황에서 범위 밖 접근으로 터지는데 백준에서 이게 "틀렸습니다"로 뜨는줄 모르고 많이 삽질했다 ㅠㅠ 컴파일에러든 뭐든 다르게 나올줄 알고 틀렸습니다는 당연히 뭔가 다른게 있는줄 ㅠㅠ
반응형
'코딩 > 문제풀이-백준' 카테고리의 다른 글
백준 1715번 - 카드 정렬하기 (C++) (0) | 2021.04.27 |
---|---|
백준 14503번 - 로봇 청소기 (C++) (0) | 2021.04.09 |
백준 1929번 - 소수 구하기 C++ (0) | 2021.04.08 |
백준 7562번 - 나이트의 이동 (C++) (0) | 2021.04.07 |
백준 6198번 - 옥상 정원 꾸미기 (C++) (0) | 2021.04.03 |
댓글