백준 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 82 83 | #include <stdio.h> #include <string.h> int num[5]; int arr[12]; int visit[12]; int N, MIN, MAX; void DFS(int a, int b, int c, int d, int n) { if (num[1] < a || num[2] < b || num[3] < c || num[4] < d) return; if (num[1] == a && num[2] == b && num[3] == c && num[4] == d) { int NUM = arr[0]; for (int i = 0; i < n; i++) { switch (visit[i]) { case 1: NUM = NUM + arr[i + 1]; break; case 2: NUM = NUM - arr[i + 1]; break; case 3: NUM = NUM * arr[i + 1]; break; case 4: NUM = NUM / arr[i + 1]; break; } } if (NUM < MIN) MIN = NUM; if (NUM > MAX) MAX = NUM; return; } visit[n] = 1; DFS(a + 1, b, c, d, n + 1); visit[n] = 2; DFS(a, b + 1, c, d, n + 1); visit[n] = 3; DFS(a, b, c + 1, d, n + 1); visit[n] = 4; DFS(a, b, c, d + 1, n + 1); return; } int main() { int Test_Case; scanf("%d", &Test_Case); for (int T = 1; T <= Test_Case; T++) { MIN = 987654321; MAX = -987654321; memset(arr, 0, sizeof(arr)); memset(visit, 0, sizeof(visit)); scanf("%d", &N); for (int i = 1; i <= 4; i++) scanf("%d", &num[i]); for (int i = 0; i < N; i++) scanf("%d", &arr[i]); DFS(0,0,0,0,0); printf("#%d %d\n",T, MAX-MIN); } return 0; } | cs |
'SW 업무 관련 > SW Expert Academy' 카테고리의 다른 글
2105. [모의 SW 역량테스트] 디저트 카페 (0) | 2018.10.05 |
---|---|
4014. [모의 SW 역량테스트] 활주로 건설 (1) | 2018.10.03 |
4013. [모의 SW 역량테스트] 특이한 자석 (0) | 2018.10.03 |
4012. [모의 SW 역량테스트] 요리사 (0) | 2018.10.03 |
5658. [모의 SW 역량테스트] 보물상자 비밀번호 (0) | 2018.09.30 |