본문 바로가기
온라인저지

[BOJ] 14888번: 연산자 끼워넣기

by plzfday 2018. 7. 26.

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

n<= 11이기 때문에 전체 탐색으로 풀 수 있다. 어떻게 코딩해야 할지 감조차 오질 않아서 고생했다. 이런 문제들은 코딩 실력을 기르는데 좋은 것 같다라는 생각을 한다.

연산자들을 OP 배열에 받고 calc()에서 연산자들을 모두 돌면서 계산을 하는데, 우리는 모든 경우를 다 했을 때 최댓값을 구해야 하기 때문에 백트래킹을 해줘야 한다. 즉, 재귀 호출 이후에 나오는 ++OP[k]; 들의 역할이 백트래킹의 역할이다.(다시 되돌려 놓고 계산하는 것)

백트래킹, 브루트포스 문제들도 많이 풀어봐야 겠다.

소스코드

#include <cstdio>
#include <algorithm>
using namespace std;

int N, A[12], OP[4];
int Max = -1e9;
int Min = 1e9;

void calc(int cnt, int v) {
    if (cnt == N) {
        Max = max(Max, v);
        Min = min(Min, v);
        return;
    }
    if (OP[0]) {
        --OP[0];
        calc(cnt + 1, v + A[cnt]);
        ++OP[0];
    }
    if (OP[1]) {
        --OP[1];
        calc(cnt + 1, v - A[cnt]);
        ++OP[1];
    }
    if (OP[2]) {
        --OP[2];
        calc(cnt + 1, v * A[cnt]);
        ++OP[2];
    }
    if (OP[3]) {
        --OP[3];
        calc(cnt + 1, v / A[cnt]);
        ++OP[3];
    }
}

int main()
{
    scanf("%d", &N);
    for (int i = 0; i < N; ++i) scanf("%d", &A[i]);
    for (int i = 0; i < 4; ++i) scanf("%d", &OP[i]);
    
    calc(1, A[0]);
    printf("%d\n%d", Max, Min);
    return 0;
}

'온라인저지' 카테고리의 다른 글

[BOJ] 3034번: 앵그리 창영  (0) 2018.07.26
[BOJ] 3035번: 스캐너  (0) 2018.07.26
[BOJ] 3036번: 링  (0) 2018.07.26
[BOJ] 1182번: 부분집합의 합  (0) 2018.07.26
[BOJ] 14650번: 걷다보니 신천역 삼 (Small)  (0) 2018.07.19
[BOJ] 14652번: 나는 행복합니다~  (0) 2018.07.19

댓글