https://www.acmicpc.net/problem/14888
14888번: 연산자 끼워넣기
첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수,
www.acmicpc.net
본문제에 대한 풀이의 해법에 대한 힌트는 덧셈, 뻴셈, 곱셈, 나눗셈의 개수가 입력으로 주어진다는 것이다.
따라서 각 연산을 매핑할 숫자로 define 하고 개수가 정해져있기 때문에 N-1 개짜리 배열을 만들 수 있고 이숫자 배열의 가능한 모든 조합들을 순회해 가면서 최대 결과값을 업데이트 하도록 구현하면 된다.
예를들어 연산자 개수가 2 1 1 1 이라면 더하기 2개 , 뻬기 1개 , 곱하기 1개 , 나누기 한개 라는 뜻이다.
그럼 { + , + , - , * , / } 배열을 만들수 있고, 더하기가 0 이고 뻬기가 1이고 곱하기가 2이고 나누기가 3으로 매핑된다면
{ 0, 0, 1, 2, 3 } 의 배열을 만들 수 있다. 이 배열의 모든 가능한 순열을 순회하면서 최대값을 구하면 된다.
구현된 코드는 아래와 같다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define DEFAULT_MAX -1000000000
#define DEFAULT_MIN 1000000000
int calc(int &op1, int &op2, int m)
{
if (m == 0) return op1 + op2;
if (m == 1) return op1 - op2;
if (m == 2) return op1 * op2;
if (m == 3) return op1 / op2;
return -1;
}
int main()
{
int nrNum;
cin >> nrNum;
vector<int> nums(nrNum);
for (int i = 0; i < nrNum; i++)
{
cin >> nums[i];
}
vector<int> opList;
int n;
for (int i = 0; i < 4; i++)
{
cin >> n;
for (int j = 0; j < n; j++)
opList.push_back(i);
}
int resultMax = DEFAULT_MAX;
int resultMin = DEFAULT_MIN;
do
{
int result = nums[0];
for (int i = 1; i < nrNum; i++)
{
result = calc(result, nums[i], opList[i - 1]);
}
resultMax = max(resultMax, result);
resultMin = min(resultMin, result);
} while (next_permutation(opList.begin(), opList.end()));
cout << resultMax << endl;
cout << resultMin << endl;
return 0;
}
'알고리즘' 카테고리의 다른 글
백준 14889 스타트와 링크 (0) | 2021.07.21 |
---|---|
백준 1339 단어수학 (0) | 2021.07.21 |
백준 2529 부등호 (0) | 2021.03.23 |
백준 11725 - 트리의 부모찾기 (0) | 2020.09.13 |
백준 1991 - 트리순회 (0) | 2020.09.13 |