-
백준 16638번 괄호 추가하기2PS 2020. 3. 15. 23:37
https://www.acmicpc.net/problem/16638
16638번: 괄호 추가하기 2
첫째 줄에 수식의 길이 N(1 ≤ N ≤ 19)가 주어진다. 둘째 줄에는 수식이 주어진다. 수식에 포함된 정수는 모두 0보다 크거나 같고, 9보다 작거나 같다. 문자열은 정수로 시작하고, 연산자와 정수가 번갈아가면서 나온다. 연산자는 +, -, * 중 하나이다. 여기서 *는 곱하기 연산을 나타내는 × 연산이다. 항상 올바른 수식만 주어지기 때문에, N은 홀수이다.
www.acmicpc.net
<접근방법>
괄호가 가장 우선순위입니다. 그 다음으로 곱셈이 나머지 연산보다 우선순위입니다.
단순히 생각한대로 구현하기만 하면 되는 문제이지만 구현 디테일이 조금 까다로웠던 문제입니다.
저는 괄호만 일괄적으로 계산, 곱셈만 일괄적으로 계산, 나머지 계산하는 순서로 풀었습니다.
<느낀 점>
<코드>
#include <iostream> #include <algorithm> #include <string> #include <vector> #include <limits.h> #include <memory.h> using namespace std; int n, lim, res = INT_MIN; bool visit[20]; string str; int cal(int a, int b, char c) { int x = 0; switch (c) { case '*': x = a * b; break; case '+': x = a + b; break; case '-': x = a - b; break; } return x; } void simul3(vector<string> v) { int sum; string a; a = v[0]; sum = stoi(a); for (int i = 1; i < (int)v.size(); i += 2) { sum = cal(stoi(a), stoi(v[i+1]), v[i][0]); a = to_string(sum); } res = max(res, sum); } void simul2(vector<string> v) { vector<string> s; string a; a = v[0]; s.push_back(a); for (int i = 1; i < (int)v.size(); i += 2) { if (v[i][0] == '*') { string a = s.back(); s.pop_back(); s.push_back(to_string(cal(stoi(a), stoi(v[i+1]), '*'))); } else { string a, b; a = v[i]; s.push_back(a); b = v[i + 1]; s.push_back(b); } } simul3(s); } void simul1() { vector<string> s; string a; a.push_back(str[0]); s.push_back(a); for (int i = 1; i < n; i += 2) { if (visit[i]) { s.pop_back(); s.push_back(to_string(cal(str[i-1] - '0', str[i+1] - '0', str[i]))); } else { string a, b; a.push_back(str[i]); s.push_back(a); b.push_back(str[i + 1]); s.push_back(b); } } simul2(s); } void dfs(int dep, int start) { if (dep == lim) { simul1(); return; } for (int i = start; i < n; i ++) { if (i % 2 == 0) continue; if (visit[i]) continue; if (i-2 >= 0 && visit[i-2]) continue; visit[i] = true; dfs(dep + 1, i + 1); visit[i] = false; } } int main() { cin >> n >> str; int sz = n / 2; for (int i = 0; i <= sz; i++) { memset(visit, false, sizeof(visit)); lim = i; dfs(0, 0); } cout << res << '\n'; return 0; }
반응형'PS' 카테고리의 다른 글
백준 16951번 블록 놀이 (0) 2020.03.17 백준 16937번 두 스티커 (0) 2020.03.15 백준 17088번 등차수열 변환 (0) 2020.03.15 백준 13913번 숨바꼭질4 (0) 2020.03.10 백준 13549번 숨바꼭질 3 (0) 2020.03.10