문제 : https://www.acmicpc.net/problem/16637
[ 알고리즘풀이 ]
■ 우리는 (N / 2) 개의 연산과 (N / 2) + 1 개의 숫자로 이루어진 식을 입력받는다. 또, 1, 3, 5, 7 ⋯ 과 같이 홀수 인덱스는 연산, 짝수 인덱스는 숫자에 해당한다.
■ N / 2 개의 연산 중 어느 곳에 괄호를 칠지 Backtracking 을 통해 모든 경우에 대해서 식을 계산해본다.
( 이때, 괄호를 친 연산 바로 다음 연산은 괄호가 겹치므로 괄호를 check 하면 안된다. )
■ 식을 앞에서부터 순회하며 괄호 유무에 따라 식을 숫자 파트와 연산 파트로 나눠서 vector 에 저장한다.
- 숫자와 숫자 다음 칸인 연산에 괄호가 쳐져있다면 그 다음 숫자와 먼저 계산을 하고 계산한 값과 그 다음 연산을 vector에 저장한다.
- 그렇지 않다면, 해당 숫자과 연산을 각각 vector에 저장한다.
■ 저장된 숫자와 연산을 계산한다.
■ 답을 갱신한다.
■ 답은 최대 9^10 으로 long long 으로 저장해줘야한다..!!!
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int N;
long long ans = -999999999999999;
string expression;
bool op[9] = {};
long long getResult(void) {
vector<long long> v1;
vector<char> v2;
int i = 0;
while(i < N){
if (op[(i + 1) / 2]) {// 숫잔데 괄호쳐져있음.
if (expression[i + 1] == '+')
v1.push_back((expression[i] - '0') + (expression[i + 2] - '0'));
else if (expression[i + 1] == '-')
v1.push_back((expression[i] - '0') - (expression[i + 2] - '0'));
else if (expression[i + 1] == '*')
v1.push_back((expression[i] - '0') * (expression[i + 2] - '0'));
if (i + 3 < N)
v2.push_back(expression[i + 3]);
i += 4;
}
else if (!op[(i + 1) / 2]){
v1.push_back(expression[i] - '0');
if(i + 1 < N)
v2.push_back(expression[i + 1]);
i += 2;
}
}
long long sum = v1[0];
for (int i = 1; i < v1.size(); i++) {
if (v2[i - 1] == '+')
sum += v1[i];
else if (v2[i - 1] == '-')
sum -= v1[i];
else if (v2[i - 1] == '*')
sum *= v1[i];
}
return sum;
}
void Backtracking(int start) {
ans = max(ans, getResult());
for (int i = start; i < N / 2; i++) {
op[i] = 1;
Backtracking(i + 2);
op[i] = 0;
}
return;
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> N >> expression;
Backtracking(0);
cout << ans;
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 11003 : 최솟값 찾기 - travelbeeee (0) | 2020.03.17 |
---|---|
[BOJ] 8120 : Coding of Permutations - travelbeeee (0) | 2020.03.16 |
[BOJ] 17779 : 게리맨더링 2 - travelbeeee (0) | 2020.03.12 |
[BOJ] 17142 : 연구소 3 (코드개선) - travelbeeee (0) | 2020.03.11 |
[BOJ] 17141 : 연구소 2 - travelbeeee (0) | 2020.03.11 |