슈뢰딩거의 고등어
14888 연산자 끼워넣기 ( DFS : 중복순열 || next_permutation) 본문
https://www.acmicpc.net/problem/14888
14888번: 연산자 끼워넣기
첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수,
www.acmicpc.net
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
// DFS
int n;
int arr[12];
vector <int> op;
bool visit[12];
int min_answer, max_answer;
vector <int> v;
// 연산자들 뽑기
// 순열
void DFS(int pick) {
// 모두 뽑았음
if(pick == n-1) {
// calculate
int result = arr[0];
for(int i=0; i<v.size(); i++) {
int b = arr[i+1];
int oper = v[i];
if(oper == 0) {
result += b;
}
else if (oper == 1) {
result -= b;
}
else if (oper == 2) {
result *= b;
}
else {
result /= b;
}
}
min_answer = min(min_answer, result);
max_answer = max(max_answer, result);
return;
}
for (int i=0; i<n-1; i++) {
if(visit[i] == true) continue;
visit[i] = true;
v.push_back(op[i]);
DFS(pick+1);
visit[i] = false;
v.pop_back();
}
}
int main() {
scanf("%d", &n);
for(int i=0; i<n; i++)
scanf("%d", &arr[i]);
for(int i=0; i<4; i++) {
int operate;
scanf("%d", &operate);
for(int j=0; j<operate; j++) {
op.push_back(i);
}
}
min_answer = 987654321;
max_answer = -987654321;
DFS(0);
printf("%d\n%d\n", max_answer, min_answer);
return 0;
}
1. 주어진 연산자 갯수에 따라 연산자값을 op 에 저장한다.
ex )
6
1 2 3 4 5 6
2 1 1 1
일 경우,
idx 0 : + :2
idx 1 : - : 1
idx 2 : * : 1
idx 3: / : 1
임으로, op[5] = {0, 0, 1, 2, 3} 순으로 들어간다.
2. 디피를 돌면서 op 의 원소들의 순열을 구한다.
3. 돌고 난 후, 구한 연산자 순열으로 계산 결과를 구한다.
next_permutation
next_permutaion 으로 순열을 자동으로 구할 수 있다.
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
// 순열
int n;
int arr[12];
vector <int> op;
int min_answer, max_answer;
int main() {
min_answer = 987654321;
max_answer = -987654321;
scanf("%d", &n);
for(int i=0; i<n; i++)
scanf("%d", &arr[i]);
for(int i=0; i<4; i++) {
int operate;
scanf("%d", &operate);
for(int j=0; j<operate; j++) {
op.push_back(i);
}
}
sort(op.begin(), op.end());
do {
int result = arr[0];
for(int i=0; i<op.size(); i++) {
int b = arr[i+1];
int oper = op[i];
if(oper == 0) {
result += b;
}
else if (oper == 1) {
result -= b;
}
else if (oper == 2) {
result *= b;
}
else {
result /= b;
}
}
min_answer = min(min_answer, result);
max_answer = max(max_answer, result);
}while(next_permutation(op.begin(), op.end()));
printf("%d\n%d\n", max_answer, min_answer);
return 0;
}
'알고리즘' 카테고리의 다른 글
21609 상어중학교 (0) | 2021.12.13 |
---|---|
21608 상어초등학교 (0) | 2021.12.11 |
17143 낚시왕 (0) | 2021.12.09 |
19237 어른상어 (0) | 2021.12.08 |
level 2 게임 맵 최단거리 (BFS) (0) | 2021.12.06 |
Comments