PS/백준
[ 백준 ] 14888번 : 연산자 끼워넣기 - ( C++/C , PYTHON/파이썬, JAVA/자바 )
발효홍삼
2022. 2. 25. 22:15
728x90
- 문제
https://www.acmicpc.net/problem/14888
14888번: 연산자 끼워넣기
첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수,
www.acmicpc.net
- 풀이법 ( 알고리즘 )
재귀적인 방법을 사용하여 풀 수 있다. 각 수에 대해 연산의 경우의 수를 고려하여 풀 수 있었다.
재귀함수는 생각보다 구현이 어렵게 느껴진다.
- 풀이 - C++ ( C )
더보기
#include <iostream>
#include <algorithm>
#define MAX 1000000000 + 1
using namespace std;
int n, P, M, MT, D, maxResult = -MAX, minResult = MAX; // n : 수의 개수 , P : 덧셈 연산자의 개수 , M : 뺄셈 연산자의 개수 , MT : 곱셈의 개수 , D : 나눗셈의 개수 . maxResult : 가장 큰 값 , minResult : 가장 작은 값
int A[11]; // A[x] : 식의 수
void solution(int idx, int sum, int plus, int minus, int multiply, int divide) // idx : 현재 가르키는 수의 인덱스 , sum : 현재까지의 값
{
if (idx == n) //모든 연산자 사용
{
maxResult = max(maxResult, sum); //최댓값 갱신
minResult = min(minResult, sum); //최솟값 갱신
}
if (plus > 0) // 덧셈 연산자를 사용할 수 있다면
solution(idx + 1, sum + A[idx], plus - 1, minus, multiply, divide); //덧셈연산자를 사용할 수 있는 횟수를 1 감소, 현재까지 합에 다음 수를 더한 상태로 함수 실행
if(minus > 0) // 뺄셈 연산자를 사용할 수 있다면
solution(idx + 1, sum - A[idx], plus, minus - 1, multiply, divide); // 뺄셈 연산자를 사용할 수 있는 횟수를 1 감소, 현재까지 합에 다음 수를 뺀 상태로 함수 실행
if(multiply > 0) // 곱셈 연산자를 사용할 수 있다면
solution(idx + 1, sum * A[idx], plus, minus, multiply - 1, divide); // 곱셈 연산자를 사용할 수 있는 횟수를 1 감소, 현재까지 합에 다음 수를 곱한 상태로 함수 실행
if(divide > 0) // 나눗셈 연산자를 사용할 수 있다면
solution(idx + 1, sum / A[idx], plus, minus, multiply, divide - 1); // 나눗셈 연산자를 사용할 수 있는 횟수를 1 감소, 현재까지 합에 다음 수를 나눈 상태로 함수 실행
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//input
cin >> n;
for (int i = 0; i < n; i++)
cin >> A[i];
cin >> P >> M >> MT >> D;
//solve
solution(1, A[0], P, M, MT, D); // 2번째, 즉 A[1]번부터 연산을 시작하므로 idx의 초깃값은 1, sum은 A[0]부터, 입력받은 각 연산자들의 수를 초깃값으로 함수 실행
//output
cout << maxResult << "\n";
cout << minResult;
return 0;
}
- 풀이 - JAVA
더보기
import java.util.*;
public class Main {
static int[] A = new int[11];
static int n, pls, mns, mt, div;
static int maxResult = -1000000000, minResult = 1000000000;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for(int i = 0; i < n; i++)
A[i] = sc.nextInt();
pls = sc.nextInt();
mns = sc.nextInt();
mt = sc.nextInt();
div = sc.nextInt();
solution(1, A[0], pls,mns,mt,div);
System.out.println(maxResult);
System.out.println(minResult);
}
public static void solution(int idx, int sum, int plus, int minus, int multiply, int divide)
{
if(idx == n)
{
maxResult = Math.max(maxResult, sum);
minResult = Math.min(minResult, sum);
}
if(plus > 0) solution(idx +1, sum + A[idx], plus - 1, minus, multiply, divide);
if(minus > 0) solution(idx +1, sum - A[idx], plus, minus - 1, multiply, divide);
if(multiply > 0) solution(idx +1, sum * A[idx], plus, minus, multiply- 1, divide);
if(divide > 0) solution(idx +1, sum / A[idx], plus, minus, multiply, divide - 1);
}
}
- 풀이 - PYTHON
더보기
n = int(input())
A = []
max_result = -1000000000
min_result = 1000000000
A = list(map(int, input().split()))
plus,minus,multiply,divide = map(int, input().split())
def solution(cnt, sum):
global plus, minus, multiply, divide, max_result, min_result
if cnt == n:
max_result = max(max_result, sum)
min_result = min(min_result, sum)
else:
if plus > 0:
plus -= 1
solution(cnt + 1, sum + A[cnt])
plus += 1
if minus > 0:
minus -= 1
solution(cnt + 1, sum - A[cnt])
minus += 1
if multiply > 0:
multiply -= 1
solution(cnt + 1, sum * A[cnt])
multiply += 1
if divide > 0:
divide -= 1
solution(cnt + 1, int(sum / A[cnt]))
divide += 1
solution(1,A[0])
print(max_result)
print(min_result)
728x90