[문제 링크]

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수이다. 

www.acmicpc.net


배열의 앞에있는 원소를 제거하고 새로운 원소를 배열의 맨 앞에 추가하기 위해 자료구조로 deque를 사용했다.

알고리즘은 간단하다. 앞에 두 원소에 대해 덧셈, 뺄셈, 곱셈, 연산을 수행한다음, 배열에서 앞에 두 원소를 빼내고 연산의 결과값을 배열 맨 앞에 추가한다.

ex) 1 2 3 4 5 -> 1+2=3 -> '3' 3 4 5-> 반복

원소 두개를 빼고 한개를 추가하기 때문에 작업이 이루어질때마다 배열의 원소 갯수는 한개씩 줄어들게 되고,

배열에 원소 갯수가 한개만 남게되면 모든 연산을 다 마쳤다는 뜻이므로 그 결과를 최댓값, 최솟값과 비교하여 저장한다. 그리고 이러한 작업을 4개 연산자로 할 수 있는 모든 경우의 수만큼 반복한다음 최댓값 최솟값을 출력해주면 원하는 답을 얻을 수 있다.


#include <iostream>
#include <vector>
#include <deque>
using namespace std;
 
deque<int> expr;
vector<int> oprt;    // oprt[0]: +, oprt[1]: -, oprt[2]: *, oprt[3]: /
const int MAX = -987654321;
const int MIN = 987654321;
 
int maximum = MAX;
int minimum = MIN;
int max(int a, int b) { return a > b ? a : b; }
int min(int a, int b) { return a < b ? a : b; }
 
int  _operator(int type)
{
    int res;
    switch (type)
    {
    case 0:
        res = expr[0+ expr[1];
        break;
    case 1:
        res = expr[0- expr[1];
        break;
    case 2:
        res = expr[0* expr[1];
        break;
    case 3:
        res = expr[0/ expr[1];
        break;
    }
    return res;
}
void Solution(deque<int>& expr, vector<int>& oprt)
{
    int len = expr.size();
    if (len == 1)    // 기저사례. expr에 원소가 한개라면 결과 출력
    {
        int result = expr[0];
        maximum = max(maximum, result);
        minimum = min(minimum, result);
        return;
    }
 
    for (int i = 0; i < 4; i++)
    {
        if (oprt[i] == 0continue;
       oprt[i]--;
        int res = _operator(i);
        int expr0 = expr[0], expr1 = expr[1];
       expr.pop_front();
       expr.pop_front();
       expr.push_front(res);
       Solution(expr, oprt);
       expr.pop_front();
       expr.push_front(expr1);
       expr.push_front(expr0);
        oprt[i]++;
    }
}
int main(void)
{
    int num;
    cin >> num;
    for (int i = 0; i < num; i++)
    {
        int n;
        cin >> n;
        expr.push_back(n);
    }
    for (int i = 0; i < 4; i++)
    {
        int n;
        cin >> n;
        oprt.push_back(n);
    }
    Solution(expr, oprt);
    cout << maximum << endl;
    cout << minimum << endl;
 
    expr.clear();
    oprt.clear();
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

알고리즘 200일 프로젝트 - 7day

내일도 열심히! 

'알고리즘 > BOJ' 카테고리의 다른 글

백준 1182번: 부분수열의 합  (0) 2020.04.13
백준 1966번: 프린터 큐  (0) 2020.04.13
백준 6603번: 로또  (0) 2020.04.12
백준 7568번: 덩치  (0) 2020.04.11
백준 14502번: 연구소  (0) 2020.04.11

+ Recent posts