백트래킹
으로 푸는 문제이다.
입력받은 부호
를 쓰기 쉽게 S의 행 단위로 나눈다.-10 ~ 10
의 숫자 중 하나를 선택한다.V
에 추가한 모든 값의 합이 현재 인덱스의 부호와 일치하면 V
에 선택한 값 추가 V
원소들을 출력한다.n = int(input())
a = [[0]*n for _ in range(n)]
b = list(input())
v, k = [], 0
def possible(idx):
s = 0
for i in range(idx, -1, -1):
s += v[i]
if a[i][idx] == '+' and s <= 0:
return False
if a[i][idx] == '0' and s != 0:
return False
if a[i][idx] == '-' and s >= 0:
return False
return True
def solve(idx):
if idx == n:
print(''.join(map(str, v)))
exit(0)
for i in range(-10,11):
v.append(i)
if possible(idx):
solve(idx+1)
v.pop()
for i in range(n):
for j in range(i, n):
a[i][j] = b[k]
k += 1
solve(0)
먼저 부호
를 -
, +
로 변환 후 저장해 둔다
값을 정할 때 인덱스의 부호를 해당 값에 곱해줘서 부호를 정한다.
이를 통해 범위를 1 ~ 10
까지로 줄일 수 있다.
0 의 경우 예외 처리를 해줘야 한다.
for i in range(1, 11):
ans[index] = i * sign[index][index]
if check(index) and solve(index + 1):
return True