삽질 포인트
- 최대 최소 범위!
- 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);
}