PS문제들

[백준] 14888: 연산자 끼워넣기

실실쟌 2022. 8. 26. 01:28

문제

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

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net

 

구상

1. 완탐이다. 순열로 브루트 포스 하고, 브루트 포스밖에 생각이 안났다 그냥.

2. 원래는 아래 같은 순열 코드를 짰었는데, swap 때문인지 시간초과가 떠서 내장함수를 활용하기로 했다.

vector<vector<char> > permu;

void permutation(vector<char> numbers, int index) {
    if(index == numbers.size()) {
        permu.push_back(numbers);
        return;
    }
    else {
        for(int i = index; i<numbers.size(); i++) {
            swap(numbers[i], numbers[index]);
            permutation(numbers, index + 1);
            swap(numbers[i], numbers[index]);
        }
    }
}

 

코드

#include<iostream>
#include<vector>
#include<climits>
#include<algorithm>
using namespace std;

char op[4] = {'+','-','*','/'};

int calculate(vector<int> numbers, vector<char> ops) {
    int N = numbers.size();
    int result = numbers[0];
    for(int i=0; i<N-1; i++) {
        char op = ops[i];
        int num = numbers[i+1];
        if(op == '+') {
            result += num;
        }
        else if(op == '-') {
            result -= num;
        }
        else if(op == '*') {
            result *= num;
        }
        else {
            result /= num;
        }
    }
    return result;
}


int main(int argc, char** argv)
{
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int N;
    vector<int> numbers;
    vector<char> ops;
    cin >> N;
    numbers.resize(N);
    for(int i=0; i<N; i++) {
        cin >> numbers[i];
    }
    for(int i=0; i<4; i++) {
        int num;
        cin >> num;
        for(int j=0; j<num; j++) {
            ops.push_back(op[i]);
        }
    }

    int max = -1000000000;
    int min = 1000000000;
    sort(ops.begin(), ops.end());

    do {
        int result = calculate(numbers, ops);
        if(result > max) {
            max = result;
        }
        if(result < min) {
            min = result;
        }

    } while(next_permutation(ops.begin(), ops.end()));

    cout << max << "\n" << min;


	return 0;
}

 

 

오늘도 행복한 하루