연산자 끼워넣기 C++ - 백준 14888

김관중·2024년 1월 15일
0

백준

목록 보기
12/129

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

이 문제는 백트래킹 문제이다.

arr에 숫자들을 저장하고, dfs를 사용하여 현재의 최댓값, 최솟값보다 초과, 미만이면 저장하는 방법으로 작성했다.

코드는 다음과 같다. (스택을 사용하지 않은 더 간결한 예제는 이 코드 밑에 있다.)

#include <bits/stdc++.h>
#define FASTIO ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define MAX 12
#define INFI 1000000000
using namespace std;

int arr[MAX];
int counts[4]; //plus minus multiple divide
int used[4];
int N;
int maxi=-1*INFI;
int mini=INFI;
int cur;
stack<int> s;

void dfs(int cnt){
	if(cnt==N-1){
		if(maxi<cur){
			maxi=cur;
		}
		if(mini>cur){
			mini=cur;
		}
		return;
	}
	
	if(used[0]<counts[0]){
		used[0]++;
		s.push(cur);
		cur+=arr[cnt+1];
		dfs(cnt+1);
		used[0]--;
		cur=s.top();
		s.pop();
	}
	if(used[1]<counts[1]){
		used[1]++;
		s.push(cur);
		cur-=arr[cnt+1];
		dfs(cnt+1);
		used[1]--;
		cur=s.top();
		s.pop();
	}
	if(used[2]<counts[2]){
		used[2]++;
		s.push(cur);
		cur*=arr[cnt+1];
		dfs(cnt+1);
		used[2]--;
		cur=s.top();
		s.pop();
	}
	if(used[3]<counts[3]){
		used[3]++;
		s.push(cur);
		cur/=arr[cnt+1];
		dfs(cnt+1);
		used[3]--;
		cur=s.top();
		s.pop();
	}
}

int main(){
	FASTIO
	cin >> N;
	for(int i=0;i<N;i++){
		cin >> arr[i];
	}
	for(int i=0;i<4;i++){
		cin >> counts[i];
	}
	cur=arr[0];
	dfs(0);
	cout << maxi << '\n' << mini;
}

다음 코드는 스택을 없애고, 파라미터를 늘려 간결화한 코드이다.

#include <iostream>
#include <algorithm>
#define MAX 1000000000
using namespace std;

int maxi=-MAX;
int mini=MAX;
int arr[11];
int n;
int signs[4];

void solve(int x, int ind, int a, int b, int c, int d){
	if(ind==n-1){
		maxi=max(maxi,x);
		mini=min(mini,x);
		return;
	}
	
	if(a<signs[0]){
		solve(x+arr[ind+1],ind+1,a+1,b,c,d);
	}
	if(b<signs[1]){
		solve(x-arr[ind+1],ind+1,a,b+1,c,d);
	}
	if(c<signs[2]){
		solve(x*arr[ind+1],ind+1,a,b,c+1,d);
	}
	if(d<signs[3]){
		solve(x/arr[ind+1],ind+1,a,b,c,d+1);
	}
}

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

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN