와이유스토리

[DFS 단순] 백준 16637 괄호 추가하기 C++ 본문

코딩테스트/그래프|트리

[DFS 단순] 백준 16637 괄호 추가하기 C++

유(YOO) 2022. 1. 31. 16:14

※ 문제

https://www.acmicpc.net/problem/16637

 

16637번: 괄호 추가하기

길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 연산자 우선순위는 모두 동일하기 때문에, 수식을 계산할 때는 왼쪽에서부터 순

www.acmicpc.net

 

※ 풀이

1) DFS 필요

#include<bits/stdc++.h>

using namespace std;

int n, ans = INT_MIN; // 음수 최저값 필요
string str;

int cal(int depth, int a, int b) {
	if (depth < 0) { // 인덱스 0 조심
		return (a + b);
	}
	if (str[depth] == '+') return (a + b);
	else if (str[depth] == '-') return (a - b);
	else if (str[depth] == '*') return (a * b);
}

void dfs(int depth, int val) { // depth 피연산자 확인
	if (depth == n - 1) { // 마지막 피연산자 계산
		ans = max(ans, cal(depth - 1, val, (str[depth] - '0')));
		return;
	}
	if (depth >= n) {
		ans = max(ans, val);
		return;
	}

	int temp = cal(depth + 1, (str[depth] - '0'), (str[depth + 2] - '0'));
	int res1 = cal(depth - 1, val, temp);
	int res2 = cal(depth - 1, val, (str[depth] - '0'));

	dfs(depth + 4, res1); // str[depth]와 str[depth+2] 괄호 계산
	dfs(depth + 2, res2); // str[depth]가 괄호 안에 없을 때 계산
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	cin >> n >> str;

	dfs(0, 0);

	cout << ans;
}
Comments