[백준 / C++] 16637번: 괄호 추가하기 (삼성 A형 기출)

728x90
728x90

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

 

16637번: 괄호 추가하기

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

www.acmicpc.net

 

난이도: solved.ac 골드 3

 

알고리즘 분류

구현, 브루트포스 알고리즘

 

접근 방법 및 구현

괄호는 한 번에 최대 두 개의 숫자만 묶을 수 있으므로 괄호는 s[i]와 s[i+2]를 묶는다.

s[i+2]가 문자열 크기를 벗어나지 않으면 괄호를 만들어 계산한다.

 

만든 괄호 안을 먼저 계산한 후, 지금까지 계산했던 결과와 함께 s[i-1]에 있는 연산자를 통해 계산한다.

 

괄호를 만들어 계산했다면 다음 index는 현재 index에서 +4가 된다.

 

계산하는 함수를 재귀로 호출해 괄호를 만드는 경우를 모두 계산하면, 다시 돌아와 s[i]를 s[i+2]와 묶지 않고 계산을 한다.

 

이전까지 계산했던 결과와 s[i]를 s[i-1] 연산자로 계산해 index를 +2 시켜 다시 재귀함수를 호출한다.

 

코드

#include <bits/stdc++.h>
using namespace std;
int N, ans = INT_MIN;
string s;
void cal(int cur, int res);
// cur은 s에서 현재 가리키는 index를 의미
// cur + 2 < N이면 s[cur]를 기점으로 하는 괄호를 만들 수 있음
// 1) s[cur]를 기점으로 괄호를 만들 수 있다면 먼저 괄호를 만들어 계산
// 2) 그 후 s[cur]를 괄호에 포함하지 않는 경우로 계산
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> N >> s;
cal(0, 0);
cout << ans;
}
void cal(int cur, int res) {
if (cur > N) {
if (res > ans)
ans = res;
return;
}
if (cur + 2 < N) {
// 괄호를 만들 수 있을 때
int tmp1, tmp2, tres;
// tmp1: 만들 괄호 안에서 첫 번째 수
// tmp2: 만들 괄호 안에서 두 번째 수
// tres: 괄호를 계산한 결과
tmp1 = (s[cur] - '0');
tmp2 = (s[cur + 2] - '0');
if (s[cur + 1] == '+')
tres = tmp1 + tmp2;
else if (s[cur + 1] == '-')
tres = tmp1 - tmp2;
else if (s[cur + 1] == '*')
tres = tmp1 * tmp2;
if (cur == 0)
cal(4, tres); // cur = 0이면 s[cur]앞에 아무 연산자도 없으므로
else {
// cur > 0일 때
if (s[cur - 1] == '+')
cal(cur + 4, res + tres);
else if (s[cur - 1] == '-')
cal(cur + 4, res - tres);
else if (s[cur - 1] == '*')
cal(cur + 4, res * tres);
}
}
// 괄호를 만들지 않는 경우
int num = s[cur] - '0';
if (cur == 0)
cal(2, num);
else {
if (s[cur - 1] == '+')
cal(cur + 2, res + num);
else if (s[cur - 1] == '-')
cal(cur + 2, res - num);
else if (s[cur - 1] == '*')
cal(cur + 2, res * num);
}
}

 

성능

백준 16637번 코드 제출 결과
코드 제출 결과

반응형