연산자 끼워넣기 (3)

김관중·2024년 1월 25일
0

백준

목록 보기
28/129

https://acmicpc.net/problem/15659

이 문제는 연산자 끼워넣기 문제의 연산자 우선순위 조건을 바꾼 문제이다.

일반 대수학의 연산자 우선순위처럼 곱하기,나눗셈 먼저, 우선순위가 같다면

앞에서부터 차근차근 계산하는 것을 구현하기 위해 백트래킹을 하면서

연산자들을 벡터에 넣어주었고, 연산자의 개수가 n-1이 되면 앞에서부터

곱하기, 나누기 연산만 해서 새로운 string 배열에 넣어주었다.

그리고 남은 string 배열의 연산을 수행해주었다.

(이 과정은 구현하는데 꽤 걸렸다.)

코드는 다음과 같다.

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int mini=(1 << 30);
int maxi=-mini;
int n;
int arr[11];
int signs[4];
vector<int> v; //0 -1 -2 -3
vector<string> strs;

void solve(int ind, int a, int b, int c, int d){
	if(ind==n-1){
		int cur=-1;
		for(int i=0;i<n-1;i++){
			if(v[i]==0){
				if(cur==-1){
					strs.push_back(to_string(arr[i]));
					strs.push_back("plus");
				}
				else{
					strs.push_back(to_string(cur));
					strs.push_back("plus");
					cur=-1;
				}
			}
			else if(v[i]==-1){
				if(cur==-1){
					strs.push_back(to_string(arr[i]));
					strs.push_back("minus");
				}
				else{
					strs.push_back(to_string(cur));
					strs.push_back("minus");
					cur=-1;
				}
			}
			else if(v[i]==-2){
				if(cur==-1){
					cur=arr[i]*arr[i+1];
				}
				else{
					cur*=arr[i+1];
				}
			}
			else if(v[i]==-3){
				if(cur==-1){
					cur=arr[i]/arr[i+1];
				}
				else{
					cur/=arr[i+1];
				}
			}
			if(i==n-2){
				if(strs.empty() || strs[strs.size()-1]=="plus" || strs[strs.size()-1]=="minus"){
					if(cur!=-1) strs.push_back(to_string(cur));
					else strs.push_back(to_string(arr[i+1]));
				}
			}
		}
		int sum=stoi(strs[0]);
		for(int i=1;i<strs.size();i++){
			if(strs[i]=="plus"){
				sum+=stoi(strs[i+1]);
				i++;
			}
			else if(strs[i]=="minus"){
				sum-=stoi(strs[i+1]);
				i++;
			}
		}
		maxi=max(maxi,sum);
		mini=min(mini,sum);
		strs.clear();
		return;
	}
	if(a<signs[0]){
		v.push_back(0);
		solve(ind+1,a+1,b,c,d);
		v.pop_back();
	}
	if(b<signs[1]){
		v.push_back(-1);
		solve(ind+1,a,b+1,c,d);
		v.pop_back();
	}
	if(c<signs[2]){
		v.push_back(-2);
		solve(ind+1,a,b,c+1,d);
		v.pop_back();
	}
	if(d<signs[3]){
		v.push_back(-3);
		solve(ind+1,a,b,c,d+1);
		v.pop_back();
	}
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cin >> n;
	for(int i=0;i<n;i++){
		cin >> arr[i];
	}
	for(int i=0;i<4;i++){
		cin >> signs[i];
	}
	solve(0,0,0,0,0);
	cout << maxi << '\n' << mini;
}
profile
꾸준히 학습하기

0개의 댓글

관련 채용 정보