반응형
14888번 연산자 끼워넣기
1. 이해하기
- 수와 수 사이에 연산자를 하나씩 넣는데 주어진 수의 순서를 바꾸면 안 된다.
- 연산자는 수의 개수-1 개가 주어지기 때문에 모두 사용해야 한다.
- 만들 수 있는 식의 결과가 최대인 것과 최소인 것을 구해야 한다.
- 만들 수 있는 결과를 모두 만들어 보는 완전탐색 문제.
2. 구현하기
-
최대인 것과 최소인 것을 반환하기 위하여 구조체를 만든다.
struct RET { int min_val,max_val; };
-
연산자를 모두 쓰는데 오버해서 쓰면 최댓값과 최솟값을 반환해준다.
RET solve(int index, int plus, int minus, int mul, int div, int val) { if(plus < 0 or minus < 0 or mul < 0 or div < 0) return {MAX,MIN}; if(plus == 0 and minus == 0 and mul == 0 and div == 0) return {val,val}; RET ret = {MAX,MIN}; RET temp = solve(index+1,plus-1,minus,mul,div,val+num[index]); ret.min_val = min(ret.min_val,temp.min_val); ret.max_val = max(ret.max_val,temp.max_val); temp = solve(index+1,plus,minus-1,mul,div,val-num[index]); ret.min_val = min(ret.min_val,temp.min_val); ret.max_val = max(ret.max_val,temp.max_val); temp = solve(index+1,plus,minus,mul-1,div,val*num[index]); ret.min_val = min(ret.min_val,temp.min_val); ret.max_val = max(ret.max_val,temp.max_val); temp = solve(index+1,plus,minus,mul,div-1,val/num[index]); ret.min_val = min(ret.min_val,temp.min_val); ret.max_val = max(ret.max_val,temp.max_val); return ret; }
3. 전체 코드
#include <iostream>
using namespace std;
const int MAX = 1000000000;
const int MIN = -MAX;
struct RET {
int min_val,max_val;
};
int num[11];
RET solve(int index, int plus, int minus, int mul, int div, int val) {
if(plus < 0 or minus < 0 or mul < 0 or div < 0) return {MAX,MIN};
if(plus == 0 and minus == 0 and mul == 0 and div == 0) return {val,val};
RET ret = {MAX,MIN};
RET temp = solve(index+1,plus-1,minus,mul,div,val+num[index]);
ret.min_val = min(ret.min_val,temp.min_val); ret.max_val = max(ret.max_val,temp.max_val);
temp = solve(index+1,plus,minus-1,mul,div,val-num[index]);
ret.min_val = min(ret.min_val,temp.min_val); ret.max_val = max(ret.max_val,temp.max_val);
temp = solve(index+1,plus,minus,mul-1,div,val*num[index]);
ret.min_val = min(ret.min_val,temp.min_val); ret.max_val = max(ret.max_val,temp.max_val);
temp = solve(index+1,plus,minus,mul,div-1,val/num[index]);
ret.min_val = min(ret.min_val,temp.min_val); ret.max_val = max(ret.max_val,temp.max_val);
return ret;
}
int main() {
int n;
cin >> n;
for(int i = 0; i < n; i++) cin >> num[i];
int plus,minus,mul,div;
cin >> plus >> minus >> mul >> div;
RET ans = solve(1,plus,minus,mul,div,num[0]);
cout << ans.max_val << '\n' << ans.min_val << '\n';
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 14890번 경사로 (0) | 2019.10.05 |
---|---|
[백준] 14889번 스타트와 링크 (0) | 2019.10.04 |
[백준] 14503번 로봇 청소기 (0) | 2019.10.04 |
[백준] 14502번 연구소 (0) | 2019.10.03 |
[백준] 14501번 퇴사 (0) | 2019.10.03 |