※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 7490번 문제인 0 만들기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/7490
7490번: 0 만들기
각 테스트 케이스에 대해 ASCII 순서에 따라 결과가 0이 되는 모든 수식을 출력한다. 각 테스트 케이스의 결과는 한 줄을 띄워 구분한다.
www.acmicpc.net
1?2?3?4?5?6?7?8?9 형태의 문자열에서 "?" 위치에 +, - 또는 공백 중 하나씩 집어넣을 경우의 수는 3^8 = 6561가지이다. 따라서, 각 자연수 N에 대하여 모든 가능한 문자열을 만들어보고, 계산해보고, 값이 0이 나오는 문자열을 출력하는 것으로 문제를 해결할 수 있다.
모든 경우의 수를 생성하는 것은 재귀함수를 이용해서 간단히 구현할 수 있다.
테스트케이스들 사이에 빈 줄을 하나 출력해야 한다는 점에 유의하자.
아스키코드 순으로 공백이 + 또는 -보다 앞서서 온다는 점 또한 유의하자. (이는 문제에 제시된 예제를 통해서도 알 수 있다.)
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
using namespace std;
string ans = "1";
void func(int digit, int a, int b, int end) {
if (digit == end) {
if (a + b == 0) cout << ans << '\n';
}
else {
digit++;
ans += " " + to_string(digit);
func(digit, a, ((b > 0) ? b * 10 + digit : b * 10 - digit), end);
ans.pop_back();
ans.pop_back();
ans += "+" + to_string(digit);
func(digit, a + b, digit, end);
ans.pop_back();
ans.pop_back();
ans += "-" + to_string(digit);
func(digit, a + b, -digit, end);
ans.pop_back();
ans.pop_back();
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T; cin >> T;
while (T--) {
int N; cin >> N;
func(1, 0, 1, N);
cout << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 23975 // C++] 정훈이는 민트초코맛 짜장라면이 먹고 싶다 (0) | 2022.01.25 |
---|---|
[BOJ 7677 // C++] Fibonacci (0) | 2022.01.24 |
[BOJ 23893 // C++] 알프스의 힘 (0) | 2022.01.22 |
[BOJ 1407 // C++] 2로 몇 번 나누어질까 (0) | 2022.01.21 |
[BOJ 17509 // C++] And the Winner Is... Ourselves! (0) | 2022.01.20 |