본문 바로가기

알고리즘/백준

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

  • 문제 링크

www.acmicpc.net/problem/14888

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net

  • 문제 해설 및 삽질 내용

모든 경우의 수를 살펴보면서 최대값과 최소값을 확인하면 된다.

연산자 우선순위를 고려하지 않고, 무조건 앞에서 부터 연산을 해야 하기에 dfs로 문제를 해결한다.

  • 소스코드
#include <iostream>
#define DBG 0
using namespace std;

long long input[11];
int operator_arr[4];
int used_operator[4];
int N;
long long final_max, final_min;
void DFS(int step, long long ret){
    long long tmp ;
   #if DBG
        cout << "DBG step " << step << " ret : " << ret << endl;
#endif
    if(step == N){
        if(final_max < ret)
            final_max = ret;
        if(final_min > ret)
            final_min = ret;
        return ;
    }
    for(int i = 0; i < 4; ++i){
        if(used_operator[i] < operator_arr[i]){
            tmp = ret;
            ++used_operator[i];
            if(i == 0){
                tmp += input[step];
            }else if( i == 1){
                tmp -= input[step];
            }else if( i == 2 ){
                tmp *= input[step];
            }else{
                tmp /= input[step];
            }
            DFS(step + 1, tmp);
            --used_operator[i];
        }
    }
    return ;
}
int main()
{
    final_min = 1000000000;
    final_max = -1000000000;
    #if DBG
    freopen("input.txt", "r", stdin);
    #endif // DBG
    cin >> N;
    for(int i = 0; i < N; ++i){
        cin >> input[i];
    }
    for(int i = 0; i < 4; ++i){
        cin >> operator_arr[i];
        used_operator[i] = 0;
    }
    DFS(1,input[0]);
    cout << final_max << endl;
    cout << final_min << endl;
    return 0;
}

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

[백준] 1966. 프린터 큐  (0) 2022.06.23
[백준] 2468. 안전 영역  (0) 2022.06.10
[백준] 미세먼지 안녕! No. 17144  (0) 2021.04.15
[백준] 테트로미노 No.14500  (0) 2021.04.14
[백준] 낚시왕 No. 17143  (0) 2021.04.13