-
[백준][C++] 16637. 괄호 추가하기Algorithm/BAEKJOON 2020. 10. 9. 19:01
삼성 A형 문제 중 하나인데 삼성은 브루트 포스를 좋아하나보다...
수식이 주어지면 수식에 적절하게 괄호를 넣어 최대 결과값을 구하는 문제이다.
중첩 괄호는 허용되지 않고, 괄호 안에는 연산자가 1개만 들어있어야 한다.
수식을 string으로 입력받은 후 숫자는 숫자끼리, 연산자는 연산자끼리 따로 배열에 저장했다.
그 다음 dfs를 사용해 "현재 연산자"를 기준으로
괄호를 추가하는 경우와 그렇지 않은 경우로 나누어서 연산을 수행했다.
예를 들어, 3 + 8 * 7 - 9 에서 현재 연산자가 +인 경우,
1. 현재 연산자를 기준으로 괄호 추가
(3 + 8)을 계산한 후 다음 연산자인 * 대해 dfs(*, 11) 수행
2. 다음 연산자를 기준으로 괄호 추가
(8 * 7)을 계산한 후 현재 피연산자(3)를 계산한다. (8 * 7) + 3
그리고 다다음 피연산자인 -에 대해 dfs(-, 59) 수행
// 16637_괄호_추가하기.cpp #define _CRT_SECURE_NO_WARNINGS using namespace std; #include <iostream> #include <string> #include <cstring> #include <vector> #include <algorithm> #define MAX 20 int n; // 수식 길이 int max_result = -987654321; // 최대값 char oper[MAX]; int num[MAX]; int cal(int a, int b, char op) { if (op == '+') return a + b; else if (op == '-') return a - b; else if (op == '*') return a * b; } void dfs(int idx, int result) { // idx: 연산자 인덱스, result: 현재까지의 연산 결과 /* 연산자 개수 = n / 2 */ if (idx >= n / 2) { // 끝까지 탐색하면 종료 max_result = max(max_result, result); return; } // 현재 연산자 기준 괄호 추가 char op = oper[idx]; int cur_result = cal(result, num[idx + 1], op); // 다음으로 오는 수와 연산 dfs(idx + 1, cur_result); // 다음 연산자 기준 괄호 추가 if (idx + 1 < n / 2) { int next_result = cal(num[idx + 1], num[idx + 2], oper[idx + 1]); // 다음 연산자에 괄호 추가해 연산 int cur_result = cal(result, next_result, op); dfs(idx + 2, cur_result); } } int main() { scanf("%d", &n); string exp; cin >> exp; int o_idx = 0; int n_idx = 0; /* 연산자 배열, 피연산자 배열 따로 저장 */ for (int i = 0; i < n; i++) { if (exp[i] == '+' || exp[i] == '-' || exp[i] == '*') { oper[o_idx++] = exp[i]; } else num[n_idx++] = exp[i] - '0'; } dfs(0, num[0]); printf("%d", max_result); return 0; }
'Algorithm > BAEKJOON' 카테고리의 다른 글
[백준][C++] 1175. 배달 (0) 2020.10.13 [백준][C++] 17070. 파이프 옮기기 1 (0) 2020.10.09 [백준][C++] 19952. 인성 문제 있어? (0) 2020.10.09 [백준][C++] 10282. 해킹 (0) 2020.09.25 [백준][C++] 14501. 퇴사 (0) 2020.09.19