알고리즘
85. 수식 만들기 [DFS]
홍루피
2021. 3. 5. 17:16
인프런 - it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 강의를 바탕으로 공부한 내용입니다.
풀이
- DFS 문제
+ - * / 개수가 주어지는데 이를 사용해서 DFS함수를 작성하는게 제대로 떠오르지 않았다
op[0]>0이면 더하기를 사용해야 한다는 것이고 op[0]--해서 DFS(L+1, res+a[L])로 뻗어 나간다.
배열엔 n-1번까지 수가 들어가기 때문에 종료조건은 L==n일 때이다. (n+1과 혼동 주의)
(중요!!) 종료 후엔 op[0]++해서 개수를 복구시켜야 한다.
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
int n, maxi=2147000000, mini=-2147000000;
int a[20],op[5];
//85. 수식 만들기
void DFS(int L, int res){
if(L==n){
//배열이 n-1까지니까 n이면 종료
if(res>maxi) maxi=res;
if(res<mini) mini=res;
}else{
if(op[0]>0){
op[0]--;
DFS(L+1, res+a[L]);
op[0]++;
}
if(op[1]>0){
op[1]--;
DFS(L+1, res-a[L]);
op[1]++;
}
if(op[2]>0){
op[2]--;
DFS(L+1, res*a[L]);
op[2]++;
}
if(op[3]>0){
op[3]--;
DFS(L+1, res/a[L]);
op[3]++;
}
}
}
int main(){
int i;
scanf("%d", &n);
for(i=0;i<n;i++){
scanf("%d", &a[i]);
}
for(i=0;i<4;i++){
scanf("%d", &op[i]);
}
DFS(1, a[0]); //첫번째 숫자 넘어감
printf("%d\n%d\n", maxi, mini);
return 0;
}