# 백준 : 연산자 끼워넣기 (14888)

문제

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

소스

(Github: https://github.com/wonjnlee/wallydev/blob/master/bj_14888_operatorinception)

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <list>
#include <cmath>
using namespace std;

long long int max_val = -1000000000;
long long int min_val = 1000000000;
int N;
int numbers[12];
int _add, _min, _mul, _div;

void DFS(int index, long long int temp_result) {
    if(index == N) {
        max_val = max(max_val, temp_result);
        min_val = min(min_val, temp_result);
        return;
    }
    if(_add) {
        _add -= 1;
        DFS(index + 1, temp_result + numbers[index]);
        _add += 1;
    }
    if(_min) {
        _min -= 1;
        DFS(index + 1, temp_result - numbers[index]);
        _min += 1;
    }
    if(_mul) {
        _mul -= 1;
        DFS(index + 1, temp_result * numbers[index]);
        _mul += 1;
    }
    if(_div) {
        _div -= 1;
        DFS(index + 1, temp_result / numbers[index]);
        _div += 1;
    }
}

int main(void)
{
    cin>>N;
    for(int i=0; i<N; i++) cin>>numbers[i];
    cin>>_add>>_min>>_mul>>_div;
    DFS(1, numbers[0]);
    cout<<max_val<<endl<<min_val<<endl;
    return 0;
}

풀이

굉장히 쉽게 풀었는데, 문제에 나온 용어의 이해를 잘못해서 좀 많은 실수가 있었다.
우선 문제 설명을 하자면, 간단하게 백트래킹 하면 된다.
+, -, *, /  각각의 갯수만큼 이 계산 저 계산 하다가 마지막까지 다 하고나서 최대 최소를 비교하면 된다.

문제는 나눗셈 규칙에 'C 기준'이라고 되어있었는데.
내가 어차피 C로 구현하면 그 기준대로 되는걸 굳이 절대값 붙이고 이것저것 하다보니;;
문제를 잘읽자!

댓글