문제출처: https://www.acmicpc.net/problem/14888
삼성전자 A형 기출문제입니다.
풀이
백트래킹을 이용하여 풀 수 있습니다.
cnt를 선언하여 숫자가 모두 사용되었는지 체크합니다.
최초에 일단 계산을 하려면 첫번째값이 필요하므로, 첫번째 값과 첫번째값이 사용되었음을 나타낼수 있게 cnt+1 두 변수를 매개변수로하는 함수를 선언하여 백트래킹으로 연산을 하면됩니다.
헷갈리시는 분들은 아래 경우처럼 식을 작게해서 이해하시고 식으로 표현해보시면좋을 것같습니다.
3
1 2 3
1 0 1 0
코드
#include<iostream> #include<algorithm> using namespace std; int min_val = 1000000001; int max_val = -1000000001; int arr[12]; int op[4]; int n; void func(int num, int cnt); int main() { cin >> n; for (int i = 0; i < n; i++) cin >> arr[i]; for (int i = 0; i < 4; i++) cin >> op[i]; //첫 숫자와 int num = arr[0]; //첫숫자를 배치하고 연산할준비하므로 //ex)"1+" 상태여서 숫자한개썼으므로 cnt=1로시작 func(num, 1); cout << max_val << endl << min_val << endl; } void func(int num, int cnt) { //숫자를 다 썼으면 if (cnt == n) { max_val = max(max_val, num); min_val = min(min_val, num); return; } //모든 연산자돌면서확인 for (int i = 0; i < 4; i++) { //연산자가 있을 때만 연산합시다. if (op[i]) { if (i == 0) { //연산 할거기때문에 연산자 횟수-1 op[i]--; //현재값과 현재 더해야하는 피연산자의 index더함 func(num + arr[cnt], cnt + 1); //백트래킹 op[i]++; } if (i == 1) { op[i]--; func(num - arr[cnt], cnt + 1); op[i]++; } if (i == 2) { op[i]--; func(num * arr[cnt], cnt + 1); op[i]++; } if (i == 3) { op[i]--; func(num / arr[cnt], cnt + 1); op[i]++; } } } }
결과
'문제풀이(BOJ) > 백트래킹' 카테고리의 다른 글
[백준 1182] 부분수열의 합 (0) | 2020.02.09 |
---|---|
[백준 6603] 로또 (0) | 2020.02.05 |
[백준 9663] N-Queen (0) | 2020.01.20 |