SWEA
SWEA 4008 숫자 만들기 (파이썬)
MC류짱
2022. 9. 30. 17:18
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeRZV6kBUDFAVH
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
풀이
def solve(index, AA):
global max_AA, min_AA, oper
if index == N:
max_AA = max(max_AA, AA)
min_AA = min(min_AA, AA)
return
# 계산할 피연산자 solve함수의 매개변수 index를 사용해서 지정
val = nums[index]
# 사칙연산의 경우의 수 4개
candi = [AA+val, AA - val, AA*val, int(AA/val)]
# 남아있을 때 까지 모든 경우의 수
if oper[0] > 0:
oper[0] -= 1
solve(index+1, candi[0])
oper[0] += 1
if oper[1] > 0:
oper[1] -= 1
solve(index+1, candi[1])
oper[1] += 1
if oper[2] > 0:
oper[2] -= 1
solve(index+1, candi[2])
oper[2] += 1
if oper[3] > 0:
oper[3] -= 1
solve(index+1, candi[3])
oper[3] += 1
for tc in range(int(input())):
N = int(input())
# 연산자의 정보
oper = list(map(int, input().split()))
# 피연산자 숫자
nums = list(map(int, input().split()))
min_AA = 0xfffffffff
max_AA = -0xfffffffff
solve(1, nums[0])
print(f'#{tc+1}', max_AA - min_AA)
해설
- 백트래킹을 이용하여 연산자의 정보를 빼고 더하며 모든 경우의 수를 만들어준다.