삽질 포인트

  • 최대 최소 범위!
    • int는 -0x3f3f3f3f ~ 0x3f3f3f3f로 하면 편하다

정답 코드

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int T, N;
vector <int> num;
vector <int> symbol;
int PL, MI, DI, MU;

int main() {


        int tmp;
        scanf("%d", &N);
        for (int i = 0; i < N; i++) {
            scanf("%d", &tmp);
            num.push_back(tmp);
        }

        scanf("%d %d %d %d", &PL, &MI, &MU, &DI);


        int max_sum = -0x3f3f3f3f;
        int min_sum = 0x3f3f3f3f;


        for (int i = 0; i < PL; i++) {
            symbol.push_back(1);
        }

        for (int i = 0; i < MI; i++) {
            symbol.push_back(2);
        }

        for (int i = 0; i < MU; i++) {
            symbol.push_back(3);
        }

        for (int i = 0; i < DI; i++) {
            symbol.push_back(4);
        }

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

// 각각의 위치에 대해서
// 1, 1, 2, 2, 3, 3, 4, 4
// 1, 1, 2, 2, 3, 4, 4, 3
// .... 이런 식으로 모든 순열이 나옴
// 연산자의 위치가 달라지므로 값의 결과도 달라지게 됨

        do {
            int sum = num[0];

            for (int i = 0; i < symbol.size(); i++) {
                if (symbol[i] == 1) {
                    sum += num[i + 1];
                }
                else if (symbol[i] == 2) {
                    sum -= num[i + 1];
                }
                else if (symbol[i] == 3) {
                    sum *= num[i + 1];
                }
                else if (symbol[i] == 4) {
                    sum /= num[i + 1];
                }
            }


            if (sum >= max_sum) {
                max_sum = sum;
            }

            if (sum <= min_sum) {
                min_sum = sum;
            }

            /*
            for (int i = 0; i < symbol.size(); i++) {
                printf("%d ", symbol[i]);
            }
            printf("\n");
            */


        } while (next_permutation(symbol.begin(), symbol.end()));

        num.clear();
        symbol.clear();

        printf("%d\n", max_sum);
        printf("%d", min_sum);



}