본문 바로가기

백준

[백준/c++] BOJ 14888 - 연산자 끼워넣기

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

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net

 

문제 설명

n개의 수로 이루어진 수열이 주어진다. 또, 수와 수 사이에 끼워넣을 수 있는 n-1개의 연산자가 주어진다. (+, -, *, /)

수와 수 사이에 연산자를 하나씩 넣어서, 수식을 하나 만들 수 있다. 계산은 연산자 우선 순위를 무시하고 앞에서부터 진행한다. n개의 수와 n-1개의 연산자가 주어졌을 때, 만들 수 있는 식의 결과가 최대인 것과 최소인 것을 구한다.

N (2 <= N <= 11)

(1 <= Ai <= 100)

해결

간단한 백트래킹 문제이다. 깊이가 n일 때 최댓값, 최솟값을 갱신한다.

수와 수 사이에 들어갈 수 있는 연산자는 총 4개이므로 4번 반복문을 돌며 연산자 배열에 해당 순서 연산자가 남아 있다면 함수를 불러 재귀적으로 들어간다.

코드

#include<bits/stdc++.h>
#define x first
#define y second
#define INF 1e9
using namespace std;

int n;
int MAX = -INF;
int MIN = INF;
vector<int> v;
int oper[4];

void func(int cnt, int num) {
    if (cnt == n) {
        if (num > MAX) MAX = num;
        if (num < MIN) MIN = num;
        return;
    }
    for (int i = 0; i < 4; i++) {
        if (oper[i] <= 0) continue;
        oper[i]--;
        if (i == 0) func(cnt + 1, num + v[cnt]);
        else if (i == 1) func(cnt + 1, num - v[cnt]);
        else if (i == 2) func(cnt + 1, num * v[cnt]);
        else func(cnt + 1, num / v[cnt]);
        oper[i]++;
    }
    return;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n;
    for (int i = 0; i < n; i++) {
        int a;
        cin >> a;
        v.push_back(a);
    }
    for (int i = 0; i < 4; i++)
        cin >> oper[i];


    func(1, v[0]);
    cout << MAX << "\n" << MIN;
}

'백준' 카테고리의 다른 글

[백준/c++] BOJ 9465 - 스티커  (0) 2023.11.30
[백준/c++] BOJ 28280 - 귀납법  (2) 2023.11.23
[백준/c++] BOJ 1245 - 농장 관리  (1) 2023.11.23
[백준/c++] BOJ 14395 - 4연산  (0) 2023.11.16
[백준/c++] BOJ 16234 - 인구 이동  (0) 2023.11.16