3. 실제적인 계산은 어떻게 ? 언제 ?
{
if (Idx >= N) // Idx의 값이 마지막 숫자를 넘어섰다면 = 종료조건
{
Answer = Bigger(Answer, Calculate()); // 계산하기 !
return;
}
for (int i = Idx; i < N; i = i + 2) // 현재 인덱스에서 반복문 시작. i의 값은 +2씩 증가 !
{
if (i + 2 < N) // 현재 인덱스 + 2가 식의 인덱스 범위 내에 있는 값이라면 괄호 추가 가능 !
{
if (GwalHo[i] == false && GwalHo[i + 2] == false)
{
GwalHo[i] = true; // 괄호를 추가
GwalHo[i + 2] = true; // +2칸 뒤에도 마찬가지로 괄호를 추가
DFS(Idx + 2); // 재귀 호출 ! Idx + 2의 값으로 호출 !
GwalHo[i] = false; // 괄호를 없애고 다른 경우도 탐색
GwalHo[i + 2] = false; // +2칸 뒤에도 마찬가지로 괄호를 없앰
}
}
else // 현재 인덱스 + 2가 식의 인덱스 범위 내에 존재하지 않음 = 마지막 숫자이면
{
DFS(i + 1); // i + 1로, Idx값은 N으로 호출 !
}
}
}
이로써 앞으로 해야할일에 1번과 2번이 동시에 해결이 되었다. 이제는 실제 계산하는 작업을 한번 해보도록 하자.
4) 우리가 계산할때의 우선순위는 괄호이다. 괄호를 무조건 먼저 계산해 주어야 한다.
본인은 벡터를 먼저 하나 만들어주었다. 벡터가 관리하는 자료형은 string이며, 이 벡터에 식에 있는 모든 값들을 추가할 것인데,
이 때 괄호안에 있는 값들은 계산 후에 추가해줄 것이다.
즉, (1 + 2) * 3 + 4 라는 식이 있다면 벡터에는 "3" , "*" , "3" , "+", "4" 가 추가될 것이다.
0부터 ~ N-1까지 반복을 하면서, 괄호가 있는 숫자라면, 계산을 먼저 해주고 vector에 push해준다.
(1 + 2) * 3 + 4 에서 가장 먼저 1을 확인하는데, 괄호가 있는 숫자이기 때문에, 현재 인덱스의 값과, 현재 인덱스+2의 값을
현재 인덱스 + 1의 기호로 계산을 해준다.
1(0) +(1) 2(2) *(3) 3(4) + (5) 4(6) ← 식으로 주어진 문자열의 각 문자와 인덱스번호. 문자(인덱스)
즉, (1 + 2)를 한 3이라는 값을 문자열로 바꿔서 "3"으로 vector에 넣어준다.
이 후, 1번 인덱스를 진행해야할까? 아니다. 이미 0, 1, 2번 인덱스들의 계산이 끝났다. 3번인덱스로 가야 제대로 된 계산이 가능
하다. 즉, 괄호가 있는 숫자를 한번 계산했다면, 그 이후 판단할 인덱스의 번호는, 현재 인덱스 + 3이 된다.
괄호가 없다면 그 문자를 그대로 vector에 넣어준다. 이 경우에는, 이후 판단 인덱스의 번호는 현재 인덱스 +1이 된다.
(1 + 2) * 3 + 4 라는 식이 있었다면 vector에 { "3" , "*" , "3" , "+", "4" } 이렇게 값들이 존재할 것이다.
바꿔서, 1 + (2 * 3) + 4라는 식이 있었다면 vector에 { "1", "+", "6", "+", "4" } 이렇게 값들이 존재할 것이다.
이후 ,Vector를 홀수번호만 탐색하면서 계산을 진행해주면 된다. 실제로 해보면 알겠지만, 홀수번호만 탐색하는 이유는 무조건
무조건 적으로 홀수번호에 연산기호가 있기 때문이다. Vector의 0번 인덱스의 값을 초기값으로, 연산기호에 맞는 연산을
진행해주면 된다.
[ 소스코드 ]
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 134 | #include<iostream> #include<cstring> #include<string> #include<vector> typedef long long ll; #define endl "\n" #define MAX 20 using namespace std; int N, Oper_Num; char MAP[MAX]; bool GwalHo[MAX]; ll Answer = -98765432198765; ll Bigger(ll A, ll B) { if (A > B) return A; return B; } void Input() { cin >> N; for (int i = 0; i < N; i++) { cin >> MAP[i]; } Oper_Num = N / 2; } ll Actual_Calc(ll N1, ll N2, string B) { if (B == "+") return N1 + N2; else if (B == "-") return N1 - N2; else if (B == "*") return N1 * N2; } ll Calculate() { vector<string> V; for (int i = 0; i < N; ) { if (GwalHo[i] == false) { string S = ""; S = S + MAP[i]; V.push_back(S); i++; } else { string S = ""; S = S + MAP[i]; ll Temp1 = stoi(S); S = ""; S = S + MAP[i + 2]; ll Temp2 = stoi(S); S = ""; S = S + MAP[i + 1]; string B_Temp = S; ll Temp_Result = Actual_Calc(Temp1, Temp2, B_Temp); V.push_back(to_string(Temp_Result)); i = i + 3; } } ll R_Value = stoi(V[0]); for (int i = 1; i < V.size(); i = i + 2) { if (V[i] == "+") { R_Value = R_Value + stoi(V[i + 1]); } else if (V[i] == "-") { R_Value = R_Value - stoi(V[i + 1]); } else if (V[i] == "*") { R_Value = R_Value * stoi(V[i + 1]); } } return R_Value; } void DFS(int Idx) { if (Idx >= N) { Answer = Bigger(Answer, Calculate()); return; } for (int i = Idx; i < N; i = i + 2) { if (i + 2 < N) { if (GwalHo[i] == false && GwalHo[i + 2] == false) { GwalHo[i] = true; GwalHo[i + 2] = true; DFS(Idx + 2); GwalHo[i] = false; GwalHo[i + 2] = false; } } else { DFS(i + 1); } } } void Solution() { DFS(0); cout << Answer << endl; } void Solve() { Input(); Solution(); } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); // freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글
[ 백준 17070 ] 파이프 옮기기1 (C++) (4) | 2019.03.12 |
---|---|
[ 백준 16638 ] 괄호 추가하기2 (C++) (2) | 2019.03.12 |
[ 백준 16637 ] 괄호 추가하기 (1) (C++) (4) | 2019.03.12 |
[ 백준 1052 ] 물병 (C++) (0) | 2019.03.11 |
[ 백준 16918 ] 봄버맨 (C++) (5) | 2019.03.11 |