2120112 | 백준 백트래킹 14888 | C++

박나연·2021년 1월 12일
0

하루백준

목록 보기
11/20

14888

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;
}
++) 근데 mymax, mymin 말고 max, min으로 제출하니 컴파일 오류가 나는데.. 왜그런지 모르겠다. ㅠ
profile
Data Science / Computer Vision

0개의 댓글