<Baekjoon> #14888 DFS_연산자 끼워넣기 c++
삼성 코딩테스트 기출 문제라고 한다
숫자들이 주어지고 그 사이에 적절하게 연산자를 끼워넣어서 최댓값과 최솟값을 구해야 한다. 주어진 연산자를 모두 다 썼을 때의 sum을 maxSum, minSum 과 비교해서 최댓값, 최솟값을 구해준다.
e.g.
num={1,2,3,4,5,6}
,(+)2개, (-)1개, (x)1개, (÷)1개
인 경우
1 ⓐ 2 ⓑ 3 ⓒ 4 ⓓ 5 ⓔ 6
에서 각 ⓐⓑⓒⓓⓔ에 각 연산자를 적절하게 넣어야 한다.
이 과정을 연산자의 수 (n-1)만큼 반복해준다
- 연산자 저장
int op[4]
에 각각의 연산자를 저장 (+,-,*,÷ 순서대로 개수를 저장)for (int i = 0; i < opNum; i++) cin >> op[i];
- dfs 함수의 매개변수는 파라미터로는
int depth, int sum
을 둔다
depth
는 +,- 등의 연산자를 몇 번째까지 채웠는지, 마지막까지 채웠을 때는sum
을maxSum
과minSum
을 비교한 후return
하기 위함이다void dfs(int depth, int sum) { if (depth == n - 1) { maxSum = max(maxSum, sum); minSum = min(minSum, sum); return; } .... }
- 연산자 사용
op[i]
에 저장된 연산자를 사용하기 위해op[i]>0
이면op
를 하나 사용하겠다는 의미로op[i]--
를 해주고i
값에 따라+,-,*,/
연산을 수행한 후 다시 사용할 것이므로op[i]++
를 해준다.
(이 부분이 backtracking에서 가장 중요한 부분, 보통 다른 DFS를 이용한 backtracking에서는visited[i]=true
로 바꾸었다가visited[i]=false
로 바꾸는 게 많다)for (int i = 0; i < opNum; i++) { if (op[i]==0) continue; op[i]--; switch (i) { case 0: dfs(depth + 1, sum + num[depth + 1]); break; case 1: dfs(depth + 1, sum - num[depth + 1]); break; case 2: dfs(depth + 1, sum * num[depth + 1]); break; case 3: dfs(depth + 1, sum / num[depth + 1]); break; } op[i]++; }
전체코드
#include <iostream> #include <vector> #include <algorithm> using namespace std; const int opNum = 4; int n; vector<int> num; int op[opNum]; int maxSum =-1000000000; int minSum = 1000000000; void dfs(int depth, int sum) { if (depth == n - 1) { maxSum = max(maxSum, sum); minSum = min(minSum, sum); return; } for (int i = 0; i < opNum; i++) { if (op[i]==0) continue; op[i]--; switch (i) { case 0: dfs(depth + 1, sum + num[depth + 1]); break; case 1: dfs(depth + 1, sum - num[depth + 1]); break; case 2: dfs(depth + 1, sum * num[depth + 1]); break; case 3: dfs(depth + 1, sum / num[depth + 1]); break; } op[i]++; } } int main() { cin >> n; num = vector<int>(n); for (int i = 0; i < n; i++) cin >> num[i]; for (int i = 0; i < opNum; i++) cin >> op[i]; dfs(0, num[0]); cout << maxSum << "\n" << minSum << endl; return 0; }
Author And Source
이 문제에 관하여(<Baekjoon> #14888 DFS_연산자 끼워넣기 c++), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kimmy/Baekjoon-14888-DFS연산자-끼워넣기-c저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)