C언어/문제풀다 하나씩

trial and error! 연산자 순열 문제

mcdn 2020. 5. 29. 20:14
반응형

ㅋㅋㅋㅋ trial and error 그 자체 

1. if else 문에 ! ? 등 다 안 채워 놓은 상태

2. num[lev] num[lev+1]로 calcul 해서 

sum이랑 num[lev+1]했어야

그래서 처음 넣을 때부터 dfs(0, num[0])으로 바꿈

3. 이번에는 잘 되는데 i, start 설정해놔서 

조합 문제가 되어버림;; 순서가 중요한 순열 문제인데

4. 경우의수가 많아졌는데 답이 4... 6이어야

문제가 조금 설명이 부족했는데 난 '두개'고르래서 서로 다른 두개인줄 알았지..

!! 처럼 같은 경우도 선택되도록 바꿈

5. 성공! 

 

 

 

이제 문제는 어디서 backtracking 해야..?

 

#include <iostream>
#include <string>
using namespace std;

int num[3];
char ope[5] = { '!','#','$','&','^' };
// ++ -- +10 +^2 0

int calcul(int num1, int num2, char op) {
	if (op == '!') {
		return num1 + num2 + num2;
	}
	else if (op == '#') {
		return num1 - num2 - num2;
	}
	else if (op == '$')
		return num1 + 10;
	else if (op == '&')
		return num2 * num2 + num1;
	else if (op == '^')
		return 0;
}
char path[3]; // op1 op2
int cnt;
void dfs(int lev, int sum) {
	
	if (lev == 2) {
		//cout << path << " " << sum << endl;
		if (sum >= 20) {
			
			cnt++;
		}
		return;
	}
	for (int i = 0; i < 5;i++) {
		path[lev] = ope[i];
		int temp = calcul(sum, num[lev + 1], ope[i]);
		dfs(lev + 1, temp);
		
	}
}


int main() {

	for (int i = 0; i < 3;i++) {
		cin >> num[i];
	}
	dfs(0, num[0]);// lev sum
	cout << cnt;

}

 

반응형