본문 바로가기
백준

백준 16638 괄호 추가하기 2

by 콩순이냉장고 2023. 10. 15.

문제 URL : https://www.acmicpc.net/problem/16638

 

16638번: 괄호 추가하기 2

길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 곱하기의 연산자 우선순위가 더하기와 빼기보다 높기 때문에, 곱하기를 먼저 계

www.acmicpc.net

 

문제 접근법 :  해당 입력값에 괄호를 추가를 하든 말든해서 해당 결과값의 maximum을 구하는 문제입니다.

모든 경우의수를 구하면 되기때문에  n=19라지만 사실상 10으로 봐야합니다. 숫자가 최대 10개이고

모든 경우의수는 2^10  =1024개가 나오기때문에 충분히 풀수있습니다.

그리고 괄호를 숫자 2개만 묶을수있고 중복은 안되니 문제는 더쉬워집니다.

단 연산자우선순위는 *가 더빠르기때문에 *일때를 잘처리해줘야합니다.

 

소스코드 :

#include <bits/stdc++.h>
using namespace std;
long long res=-1e15;
string s;
int n;
long long cal(char c,long long a,long long b){
    if(c=='+')
        return a+b;
    else if(c=='-')
        return a-b;
    else
     return a*b;
}
void dfs(int idx=1,long long before=0,long long sum=0){
    if(idx>=n+1){
        res=max(res,sum);
        return;
    }
    long long num = s[idx]-'0';
    char c=s[idx-1];
    //괄호를 추가안할때
    if(c=='+')
        dfs(idx+2,num,sum+num);
    else if(c=='-')
        dfs(idx+2,-num,sum-num);
    else
        dfs(idx+2,before*num,sum-before+before*num);
    //괄호를 추가할때
    if(idx+2<=n){
        long long num2 = s[idx+2]-'0';
        char c2 = s[idx+1];
        long long acc = cal(c2,num,num2);
        if(c=='+')
            dfs(idx+4,acc,sum+acc);
        else if(c=='-')
            dfs(idx+4,-acc,sum-acc);
        else
            dfs(idx+4,before*acc,sum-before+before*acc);
    }    
}
void input(){
    cin>>n;
    cin>>s;
}
void solve(){
    s="+"+s;
    dfs();
    cout<<res<<endl;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    //freopen("input.txt","r",stdin);
    input();
    solve();


}

 

 

이거풀고나서 다른사람코드들을 보려고했는데 파이썬이 많더군요

저는 c++이 익숙해져있었는데 파이썬 코드보고 경악했습니다.

eval()이라는 라이브러리가 존재했고 문자열 수식을 계산해주는 라이브러리가 있다니 놀랠노자라...

기회가 된다면 나중에 파이썬으로 갈아타야하나 생각이 들기도하는 문제였습니다. ㅠ.ㅠ

 

궁금한점 혹은 모르는점 어떤 질문이든 댓글은 언제나 환영입니다.

'백준' 카테고리의 다른 글

백준 1506 경찰서  (2) 2023.12.09
백준 4196 도미노  (0) 2023.12.07
백준 13544 수열과 쿼리 3  (1) 2023.10.15
백준 13905 세부  (0) 2023.06.15
백준 18405 경쟁적 전염  (0) 2023.06.14