포스트

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

문제

난이도 : 실버 1 백준 14888번 : 연산자 끼워넣기

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <bits/stdc++.h>

using namespace std;

int N;
vector<int> v;
vector<int> op;

int answer_max = INT_MIN;
int answer_min = INT_MAX;

int main()
{
    cin >> N;
    
    int input;
    for (int i = 0; i < N; i++)
    {
        cin >> input;
        v.push_back(input);
    }

    for (int i = 0; i < 4; i++)
    {
        cin >> input;

        for (int j = 0; j < input; j++)
        {
            op.push_back(i);
        }
    }

    sort(op.begin(), op.end());

    do
    {
        int sum = v[0];

        for (int i = 0; i < op.size(); i++)
        {
            int a = v[i + 1];

            switch (op[i])
            {
            case 0:
                sum = sum + a;
                break;
            case 1:
                sum = sum - a;
                break;
            case 2:
                sum = sum * a;
                break;
            case 3:
                sum = sum / a;
                break;
            }

        }

        if (sum > answer_max)
            answer_max = sum;

        if (sum < answer_min)
            answer_min = sum;

    }while (next_permutation(op.begin(), op.end()));
   
    cout << answer_max << '\n' << answer_min;


    return 0;
}

풀이

완전탐색으로 모든 경우의 수를 골라 값을 구하는 문제
벡터 v에는 피연산자를 담고 op에는 연산자를 담을 것임. 연산자를 담을 때 next_permutation 함수로 모든 순열을 구하기 위해 int형으로 담아주었다. 0은 덧셈, 1은 뺄셈, 2는 곱셈, 3은 나눗셈으로
오름차순으로 정렬해준 뒤 do-while문을 통해 next_permutation 함수를 돌리고 앞에서부터 연산을 해내가며 최솟값, 최댓값을 구하면 되는 문제이다.
강의에서는 재귀함수로 구현했는데 재귀 함수를 쓰는 케이스는 재귀 함수로 풀어보려는 노력을 해야할 것 같다.
아 그리고 아무 생각없이 answer_max를 처음 0으로 초기화해서 값이 음수밖에 없는 경우 최댓값 갱신이 안되어 처음에 틀렸다. 주의하자

결과

image

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.