[BOJ 7490,Python] 创建 0
用 Python 解决 BOJ 7490 "归零 "问题
问题链接
分类
回溯, 强制算法, 实现, 字符串
描述
我认为这是一个典型的反向追踪问题。不过,我发现处理过程有点深奥,ASCII 排序有点不寻常。
我看到可以用 Python 的 Eval 函数轻松解决这个问题,但我没有用它,而是用了一种困难的方法。
基本上,我取了一个数字和两个之前未处理的数字之和,然后进行回溯,以为它会检查 "加法"、"减法 "和 "无操作 "这三种情况,结果我得到了正确答案。
已解决代码。
# 0 만들기
import sys
input = sys.stdin.readline
def make_sum_zero(
result_arr: set,
target_arr: list,
last_index: int,
now_index: int = 0,
sum_now: int = 0,
now_calc: int = 0,
log=[],
) -> None:
"""
백트래킹을 활용하여 숫자들의 합이 0이 되도록 만드는 함수
"""
if last_index == now_index:
if not sum_now + now_calc:
result_arr.add("".join(log))
else:
if not now_index:
make_sum_zero(
result_arr,
target_arr,
last_index,
now_index + 1,
0,
target_arr[now_index],
[str(target_arr[now_index])],
)
else:
new_number = target_arr[now_index]
make_sum_zero(
result_arr,
target_arr,
last_index,
now_index + 1,
sum_now + now_calc,
new_number,
log + ["+", str(new_number)],
)
make_sum_zero(
result_arr,
target_arr,
last_index,
now_index + 1,
sum_now + now_calc,
-new_number,
log + ["-", str(new_number)],
)
if now_calc < 0:
make_sum_zero(
result_arr,
target_arr,
last_index,
now_index + 1,
sum_now,
10 * now_calc - new_number,
log + [" ", str(new_number)],
)
else:
make_sum_zero(
result_arr,
target_arr,
last_index,
now_index + 1,
sum_now,
10 * now_calc + new_number,
log + [" ", str(new_number)],
)
testcase = int(input())
output = []
for _ in range(testcase):
arr_length = int(input())
result = set()
# 함수를 통해 결과 확인
target_arr = [i for i in range(1, arr_length + 1)]
make_sum_zero(result, target_arr, arr_length)
# 혹여라도 겹치는 결과가 있다면 Set을 통해 배제, ASCII 순으로 정렬
sort_result = sorted(list(result), key=lambda x: ascii(x))
output.append(sort_result)
# 문제 조건에 맞춰 출력
for idx in range(testcase):
for element_idx in range(len(output[idx])):
print(output[idx][element_idx])
if idx != testcase - 1:
print("")
댓글 작성
게시글에 대한 의견을 남겨 주세요.