14888번 : 연산자 끼워넣기
입력받은 연산자 갯수를 기반으로 모두 조합하여 최댓값과 최소값을 구해 출력하는 문제이다!
재귀함수를 통해 연산을 하고 파라미터로 넘겨주며 결과값을 도출하는 방식으로 진행하였다.
🎈 get 함수(재귀함수)
void get(int result, int idx) { if (idx == N) { if (result > mymax) mymax = result; if (result < mymin) mymin = result; return; } for (int i = 0; i < 4; i++) { if (oper[i] > 0) { oper[i]--; if (i == 0) get(result + num[idx], idx + 1); else if (i == 1) get(result - num[idx], idx + 1); else if(i == 2) get(result * num[idx], idx + 1); else get(result / num[idx], idx + 1); oper[i]++; } } return; }
max와 min 을 각각 결과값과 비교하여 max min을 설정해주고, 연산자를 저장해둔 배열을 돌며 연산자에 맞게 result를 계산하여 재귀함수로 넘겨준다. 마지막에
oper[i]++;
부분은 재귀함수 때문에 연산자배열이 이중으로 빼지는 것을 바로잡아주는 역할이다. idx 는 입력한 숫자의 index를 의미하며 재귀함수를 불러줄때마다 숫자를 한번씩 쓰는 것이므로 +1을 하며 넘겨주어 순서대로 계산을 진행한다.
#include <iostream>
using namespace std;
int N;
int num[11];
int oper[4];
int mymin = 1000000001;
int mymax = -1000000001;
void get(int result, int idx) {
if (idx == N) {
if (result > mymax)
mymax = result;
if (result < mymin)
mymin = result;
return;
}
for (int i = 0; i < 4; i++) {
if (oper[i] > 0) {
oper[i]--;
if (i == 0)
get(result + num[idx], idx + 1);
else if (i == 1)
get(result - num[idx], idx + 1);
else if(i == 2)
get(result * num[idx], idx + 1);
else
get(result / num[idx], idx + 1);
oper[i]++;
}
}
return;
}
int main() {
// + - x %
cin >> N;
for (int i = 0; i < N; i++)
cin >> num[i];
for (int i = 0; i < 4; i++)
cin >> oper[i];
get(num[0], 1);
cout <<mymax << '\n';
cout << mymin;
}