알고리즘 문제/BOJ
14888번 연산자 끼워넣기
parkit
2018. 8. 23. 15:37
728x90
반응형
삼성 SW 역량 테스트 기출 문제이다.
브루트 포스 + 백트래킹 문제로 난 풀지 못 하였다.
다른 블로거 분의 코드를 참고하였다.
브루트 포스와 백트래킹이 결합된 문제를 많이 풀어봐야겠다.
30번 째 줄 코드에서 i는 0부터 시작해야 모든 경우의 수를 다 따질 수 있다.(브루트 포스)
https://www.acmicpc.net/problem/14888
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | #include <iostream> #include <queue> #include <cstdio> #include <vector> #include <cstring> #include <string> #include <math.h> #include <algorithm> using namespace std; int N = 0; int num[12] = { 0, }; int oper[4] = { 0, }; int max_num = -987654321, min_num = 987654321; void BackTracking(int sum, int pos) { if (pos == N - 1) { max_num = max(max_num, sum); min_num = min(min_num, sum); return; } for (int i = 0; i < 4; i++) { if (oper[i] != 0) { if (i == 0) { --oper[i]; BackTracking(sum + num[pos + 1], pos + 1); ++oper[i]; } else if (i == 1) { --oper[i]; BackTracking(sum - num[pos + 1], pos + 1); ++oper[i]; } else if (i == 2) { --oper[i]; BackTracking(sum * num[pos + 1], pos + 1); ++oper[i]; } else if (i == 3) { --oper[i]; BackTracking(sum / num[pos + 1], pos + 1); ++oper[i]; } } } } int main(void) { scanf("%d", &N); for (int i = 0; i < N; i++) { scanf("%d", &num[i]); } for (int i = 0; i < 4; i++) { scanf("%d", &oper[i]); } BackTracking(num[0], 0); printf("%d\n%d\n", max_num, min_num); return 0; } | cs |
728x90
반응형