Problem Solving/Online Judge
[BOJ] #7490 - 0 만들기
se0m
2021. 6. 15. 02:18
7490번: 0 만들기
각 테스트 케이스에 대해 ASCII 순서에 따라 결과가 0이 되는 모든 수식을 출력한다. 각 테스트 케이스의 결과는 한 줄을 띄워 구분한다.
www.acmicpc.net
** 문제 유형
- 재귀 호출, 완전 탐색
** 풀이
- 자연수 N의 범위(3 <= N <= 9)가 매우 한정적이므로, 완전 탐색으로 문제 해결 가능
- 수의 리스트와 연산자 리스트를 분리하여 모든 경우의 수를 계산 (재귀 함수 이용)
- 파이썬의 eval() 함수를 이용하여 문자열 형태의 표현식을 계산
ex) n = 3 일 때,
수 리스트 = [1, 2, 3]
연산자 리스트 = [' ', '+', '-']
전체 경우의 수: 3^(n-1) = 3^2 = 9 (∵ 1, 2, 3 사이사이에 연산자가 들어가야 하므로)
import copy
def recursive(array, n): # 크기가 n인 모든 연산자 조합
if len(array) == n: # n개가 채워지면
operators_list.append(copy.deepcopy(array)) # array.pop()에 의해 빈 리스트가 되기 전에 copy
return
array.append(' ')
recursive(array, n)
array.pop()
array.append('+')
recursive(array, n)
array.pop()
array.append('-')
recursive(array, n)
array.pop()
tc = int(input())
for _ in range(tc):
operators_list = []
n = int(input())
recursive([], n - 1)
integers = [i for i in range(1, n + 1)]
for operators in operators_list:
string = ""
for i in range(n - 1): # 숫자 사이에 연산자 삽입
string += str(integers[i]) + operators[i]
string += str(integers[-1])
if eval(string.replace(' ', '')) == 0:
print(string)
print()