https://www.acmicpc.net/problem/14888
1. 문제 이해
첫째 줄에 수의 개수 N, 둘째 줄에는 A1, A2, ..., AN이 주어진다. 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수이다. 첫째 줄에 만들 수 있는 식의 결과의 최댓값을, 둘째 줄에는 최솟값을 출력한다.
2. 조건
* 우선순위 무시하고 앞에서 부터 식 계산
* 나눗셈은 몫만 취함
* 음수를 양수로 나눌 때는 양수로 바꾸고 계산 후 음수로 바꾸기
* -10억 ~ 10억 이므로 int 처리 가능
3. 풀이
해당 문제는 순열 문제이다.
algorithm 헤더에 있는 next_permutaion 하면 쉽게 풀리는 문제이다.
왜 내 기억 속에는 next_permutation은 정렬해야한다고 생각했는지...
sort 빼니 잘 돌아간다
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
int n, num;
vector<int> v, op; //숫자들, 연산자 수
int minNum = 1000000000, maxNum = -1000000000;
cin >> n;
while (n--) {
cin >> num;
v.push_back(num);
}
for (int i = 0; i < 4; i++) {
cin >> num;
for (int j = 0; j < num; j++) {
op.push_back(i);
}
}
do {
int sum = v[0];
for (int i = 0; i < v.size() - 1; i++) {
switch (op[i]) {
case 0: // +
sum += v[i + 1];
break;
case 1: // -
sum -= v[i + 1];
break;
case 2: // *
sum *= v[i + 1];
break;
case 3: // /
sum /= v[i + 1];
break;
}
}
if (sum < minNum) { //최솟값
minNum = sum;
}
if (sum > maxNum) { //최댓값
maxNum = sum;
}
} while (next_permutation(op.begin(), op.end()));
cout << maxNum << "\n" << minNum;
return 0;
}
'⚖️Algorithm' 카테고리의 다른 글
[백준 11057] 오르막 수 (0) | 2022.07.16 |
---|---|
[백준 16936] 나3곱2 (0) | 2022.07.12 |
[코딩테스트] 2-3. 깊이/너비 우선 탐색(DFS/BFS) (0) | 2022.07.08 |
[코딩테스트] 2-2. 동적계획법 (DP - Dynamic Programming) (0) | 2022.07.08 |
[코딩테스트] 2-1. 힙(Heap) (0) | 2022.07.08 |