-
백준(BOJ) 16638번 괄호 추가하기 2알고리즘 풀이/백준(Boj) 2020. 4. 9. 15:26
문제 : https://www.acmicpc.net/problem/16638
16638번: 괄호 추가하기 2
길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 곱하기의 연산자 우선순위가 더하기와 빼기보다 높기 때문에, 곱하기를 먼저 계산 해야 한다. 수식을 계산할 때는 왼쪽에서부터 순서대로 계산해야 한다. 예를 들어, 3+8×7-9×2의 결과는 41이다. 수식에 괄호를 추가하면, 괄호 안에 들어있는 식은 먼저 계산해야 한다. 단, 괄호 안에는 연산자가 하나만 들어 있어야 한다. 예를 들어,
www.acmicpc.net
풀이 :
기존 괄호 추가하기 문제는 단순히 해당하는 괄호 연산 (A 연산자 B) 를 ( A 연산자 B + 0 ) 의 형태로 바꾸어서
계산해주었지만 곱셈 우선 계산 시 0 * 다음값이 되어 0이 나오므로 다른 방법이 필요하다.
따라서 여분의 배열을 하나더 만들어서 괄호 부분은 A연산자B만 담게 되고 연산자로 곱하기를 만나게 되면 여분의 배
열에 값과 계산해서 다시 넣어주는 형태로 작성하였다.
코드 ( C++ )
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters#include <iostream> #include <string> #include <algorithm> #include <vector> using namespace std; int n; vector<int> v; int ans = -2147483648; void solve(int begin, vector<int> p, vector<int> cand, int cnt) { if (p.size() == cnt) { // 중복 괄호 제거 for (int i = 0; i < p.size()-1; ++i) { if (p.size() == 0) break; if (p[i + 1] - p[i] == 2) return; } vector<int> cp(v); //괄호계산 for (int i = 0; i < p.size(); ++i) { int x = p[i]; if (cp[x] == 0) { cp[x - 1] += cp[x + 1]; cp[x] = -1; cp[x + 1] = 0; } else if (cp[x] == 1) { cp[x - 1] -= cp[x + 1]; cp[x] = -1; cp[x + 1] = 0; } else { cp[x - 1] *= cp[x + 1]; cp[x] = -1; cp[x + 1] = 0; } } //곱하기계산 vector<int> temp; for (int i = 0; i < cp.size(); ++i) { if (i % 2 == 0) temp.push_back(cp[i]); else { //괄호였다면 0이 추가 되므로 그냥 뛰어넘는다. if (cp[i] == -1) { i++; } else { //곱하기라면 if (cp[i] == 2) { int num = temp.back() * cp[i + 1]; temp.pop_back(); temp.push_back(num); i++; } else { temp.push_back(cp[i]); } } } } //왼쪽부터계산 int ret = temp[0]; for (int i = 1; i < temp.size(); ++i) { if (i % 2 == 1) { if (temp[i] == 0) { ret += temp[i + 1]; } else if (temp[i] == 1) { ret -= temp[i + 1]; } else ret *= temp[i + 1]; } } ans = max(ans, ret); return; } for (int i = begin + 1; i < cand.size(); ++i) { p.push_back(cand[i]); solve(i, p,cand, cnt); p.pop_back(); } } int main() { cin >> n; v = vector<int>(n); string s; cin >> s; for (int i = 0; i < n; ++i) { if (i % 2 == 1) { if (s[i] == '+') v[i] = 0; else if (s[i] == '-') v[i] = 1; else v[i] = 2; } else v[i] = s[i] - '0'; } vector<int> cp(v); vector<int> cand; for (int i = 0; i < n; ++i) { if (i % 2 == 1) cand.push_back(i); } vector<int> picked; for (int i = 0; i <= (n - 1) / 2; ++i) { solve(-1, picked, cand,i); } cout << ans << "\n"; return 0; } '알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글
백준(BOJ) 1806번 부분합 (0) 2020.04.15 백준(BOJ) 1022번 소용돌이 예쁘게 출력하기 (0) 2020.04.14 백준(BOJ) 1726번 로봇 (0) 2020.04.08 백준(BOJ) 11559번 Puyo Puyo (0) 2020.04.08 백준(BOJ) 17142번 연구소 3 (0) 2020.03.31