알고리즘&자료구조/문제

[BOJ] 7490 0 만들기 C++

Nakuri 2023. 5. 29. 00:37
728x90

개요

https://www.acmicpc.net/problem/7490

 

7490번: 0 만들기

각 테스트 케이스에 대해 ASCII 순서에 따라 결과가 0이 되는 모든 수식을 출력한다. 각 테스트 케이스의 결과는 한 줄을 띄워 구분한다.

www.acmicpc.net

골드5 난이도 문제

풀이

단순한 구현 문제인듯했다.

처음에 '+' '-' 입력만 보고 왜 골드지 싶었는데 ,, 공백 입력이 있었다.

재귀로 문자열을 합쳐가며 답을 구했다.

코드

#include<bits/stdc++.h>
using namespace std;

void recursiveSearch(int N, int currentN = 1, string expression = "1");
int getSum(string expressionStr);
int convertOperatorToInt(char opertator);


int main() {
	cin.tie(0)->sync_with_stdio(0);

	int T, N;
	cin >> T;

	while (T--)
	{
		cin >> N;
		recursiveSearch(N);
		cout << "\n";
	}
}

void recursiveSearch(int N, int currentN, string expression) {
	if (N == currentN) {
		if (getSum(expression) == 0) cout << expression << "\n";
		return;
	}
	int nextN = currentN + 1;
	// ASCII : ' ' -> '+' -> '-'
	recursiveSearch(N, nextN, expression + ' ' + to_string(nextN));
	recursiveSearch(N, nextN, expression + '+' + to_string(nextN));
	recursiveSearch(N, nextN, expression + '-' + to_string(nextN));
}

int getSum(string expression) {
	int sum = 0;
	int sign = 1;
	int operand = 1;
	// i : operator index
	for (int i = 1; i < expression.length(); i += 2) {
		char curOperaotor = expression[i];
		int nextOperand = expression[i + 1] - '0';

		if (curOperaotor == '+' || curOperaotor == '-') {
			sum += operand * sign;
			sign = convertOperatorToInt(curOperaotor);
			operand = nextOperand;
		}
		else if (curOperaotor == ' ') {
			operand = operand * 10 + nextOperand;
		}
	}
	sum += operand * sign;
	return sum;
}

int convertOperatorToInt(char opertator)
{
	int sign = 1;
	if (opertator == '+') sign = 1;
	else if (opertator == '-')  sign = -1;
	return sign;
}

'알고리즘&자료구조 > 문제' 카테고리의 다른 글

[BOJ] 12865 평범한 배낭 C++  (2) 2023.05.29
[BOJ] 2564 경비원 C++  (0) 2023.05.29
[BOJ] 16990 마법 장벽 C++  (0) 2023.05.24
[BOJ] 1149 RGB거리 C++  (0) 2023.05.15
[BOJ] 4811 알약 C++  (0) 2023.05.15