이번 글은 숫자 수열에서 "+", "-", "공백"을 활용하여 전체 계산 결과가 0이 되도록 만드는 문제를 해결해보려고 합니다. 이 문제를 풀기 위해 작성한 코드와 함께 문제 해결 과정을 살펴보겠습니다.
문제 설명
주어진 수열에 숫자 사이에 "+", "-", "공백"을 삽입하여 전체 계산 결과가 0이 되도록 만들어야 합니다. 단, 첫 번째 숫자 앞에는 연산자를 넣을 수 없으며, 공백은 이전 숫자와 연결된 숫자로 처리됩니다. 예를 들어, "2 3"이면 23으로 처리됩니다.
입력과 출력
입력으로는 정수 N이 주어지며, 출력으로는 0을 만들 수 있는 모든 수식을 출력해야 합니다. 출력은 공백, "+", "-" 순서로 출력되어야 합니다.
예시
입력: 7
출력:
1+2-3+4-5-6+7
1+2-3-4+5+6-7
1-2 3+4+5+6+7
1-2 3-4 5+6 7
1-2+3+4-5+6-7
1-2-3-4-5+6+7
순서도
코드 분석
#include <stdio.h>
char s[20];
int d;
// a부터 시작하여 빈 칸이 나오기 전까지 숫자를 이어 붙이는 함수
int f(int a) {
int p = a;
while (s[(a * 2) - 1] == ' ') {
p = p * 10 + a + 1;
a++;
}
return p;
}
// 0인지 확인하는 함수
int f2() {
int a = f(1);
for (int i = 1; i < d * 2 - 1; i++) {
if (s[(i * 2) - 1] == '+')
a += f(i + 1);
else if (s[(i * 2) - 1] == '-')
a -= f(i + 1);
}
if (a == 0)
return 1; // 1 반환
else
return 0; // 0 반환
}
// 수식을 생성, 출력
void f3(int a) {
if (a == d) {
if (f2() == 1) {
for (int i = 0; i < d * 2 - 1; i++)
printf("%c", s[i]);
puts("");
}
return;
}
s[(a * 2) - 1] = ' ';
f3(a + 1);
s[(a * 2) - 1] = '+';
f3(a + 1);
s[(a * 2) - 1] = '-';
f3(a + 1);
}
int main() {
int k = 49; // 아스키 코드 값 49 = '1'
scanf("%d", &d); // 숫자의 개수
// 수식 문자열 초기화
for (int i = 0; i < d * 2;) {
s[i] = k;
k++;
i += 2;
}
f3(1); // 수식 생성, 출력
return 0;
}
코드 설명
이 코드는 입력받은 수 N을 기반으로 숫자 수열을 생성하고, 모든 가능한 조합을 시도하여 0을 만드는 수식을 찾아냅니다. 다음은 코드의 주요 함수입니당
실행화면
3806 : 동물원 (0) | 2023.07.03 |
---|---|
3707 : 합의 개수 (0) | 2023.07.03 |
3520 : 체커 도전 (N-Queen Problem) (0) | 2023.05.31 |
먹느냐 먹히느냐 (2) | 2023.05.18 |
[관계기반설계] [메모이제이션] CodeUp 문제풀이 (3) | 2023.03.13 |