백준#7490 0만들기
문제
https://www.acmicpc.net/problem/7490
풀이
나의 풀이
- 재귀를 사용해서 풀진 못했다
case_num = int(input())
def get_formulas(num: int):
formulas = ['', '', '']
for n in range(1, num+1):
new_formulas = []
for formula in formulas:
if n == num:
new_formulas.append(formula + str(n))
else:
for cal in ['+', '-', ' ']:
new_formulas.append(formula+str(n)+cal)
formulas = new_formulas
return sorted(list(set(formulas)))
def cal_formula(formula: str):
new_formula = formula.replace(' ', '')
result = eval(new_formula)
return result
def find_zero_index(formulas):
result = []
for index, f in enumerate(formulas):
if cal_formula(f) == 0:
result.append(index)
return result
for _ in range(case_num):
num = int(input())
formulas = get_formulas(num)
indexes = find_zero_index(formulas)
for index in indexes:
print(formulas[index])
print()
다른 사람의 풀이
- 자연수 N의 범위(3<=N<=9)가 매우 한정적이므로, 완전탐색으로 문제를 해결할 수 있음
- 수의 리스트와 연산자 리스트를 분리하여 모든 경우의 수를 계산
- 가능한 모든 경우를 고려하여 연산자 리스트를 만드는 것이 관건 (재귀 함수 이용)
- 파이썬의 eval()함수를 이용하여 문자열 형태의 표현식을 계산할 수 있음
import copy
def recursive(array, n):
if len(array) == n:
operators_list.append(copy.deepcopy(array))
return
array.append(' ')
recursive(array, n)
array.pop()
array.append('+')
recursive(array, n)
array.pop()
array.append('-')
recursive(array, n)
array.pop()
test_case = int(input())
for _ in range(test_case):
operators_list = []
n = int(input())
recursive([], n-1)
integers = [i for i in range(1, n+1)]
for operator in operators_list:
string = ""
for i in range(n-1):
string += str(integers[i]) + operator[i]
string += str(integers[-1])
if eval(string.replace(" ", "")) == 0:
print(string)
print()
느낀점
Author And Source
이 문제에 관하여(백준#7490 0만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@muchogusto/백준7490-0만들기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)